Version 2.14.0-25.0.dev

Merge commit 'a65ab5e09ca0f95fb2150eb8377cd18c863c7446' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index a8af89d..b050ba3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -4794,10 +4794,6 @@
   @override
   void write(Node node, Variable variable, Type writtenType,
       Expression? writtenExpression) {
-    assert(
-        _assignedVariables._anywhere._written.contains(variable),
-        "Variable is written to, but was not included in "
-        "_variablesWrittenAnywhere: $variable");
     _writeStackForAnd.last.add(variable);
   }
 
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
index d7c28eb..af0f56b 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
@@ -452,3 +452,26 @@
           /*notPromoted(propertyNotPromoted(target: member:C33.bad, type: int?))*/ bad)
       .f();
 }
+
+class C34 {
+  int? bad;
+  C34(int value);
+}
+
+class D34 extends C34 {
+  int other;
+  D34(C34 c)
+      : other = c.bad!,
+        super(c.
+            /*notPromoted(propertyNotPromoted(target: member:C34.bad, type: int?))*/ bad);
+}
+
+class C35 {
+  int? bad;
+}
+
+indexSetRhs(C35 c, List<int> x) {
+  if (c.bad == null) return;
+  x[0] = c.
+      /*notPromoted(propertyNotPromoted(target: member:C35.bad, type: int?))*/ bad;
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 399bc43..e85f8b7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -684,13 +684,10 @@
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
-    FlowAnalysisHelper? flowAnalysisHelper;
-    if (unit.featureSet.isEnabled(Feature.non_nullable)) {
-      flowAnalysisHelper =
-          FlowAnalysisHelper(_typeSystem, _testingData != null);
-      _testingData?.recordFlowAnalysisDataForTesting(
-          file.uri, flowAnalysisHelper.dataForTesting!);
-    }
+    FlowAnalysisHelper flowAnalysisHelper = FlowAnalysisHelper(_typeSystem,
+        _testingData != null, unit.featureSet.isEnabled(Feature.non_nullable));
+    _testingData?.recordFlowAnalysisDataForTesting(
+        file.uri, flowAnalysisHelper.dataForTesting!);
 
     unit.accept(ResolverVisitor(
         _inheritance, _libraryElement, source, _typeProvider, errorListener,
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index c394437..2d5a144 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -703,10 +703,8 @@
     // Nothing for RESOLVED_UNIT9?
     // Nothing for RESOLVED_UNIT10?
 
-    FlowAnalysisHelper? flowAnalysisHelper;
-    if (unit.featureSet.isEnabled(Feature.non_nullable)) {
-      flowAnalysisHelper = FlowAnalysisHelper(_typeSystem, false);
-    }
+    FlowAnalysisHelper flowAnalysisHelper = FlowAnalysisHelper(
+        _typeSystem, false, unit.featureSet.isEnabled(Feature.non_nullable));
 
     var resolverVisitor = ResolverVisitor(
         _inheritance, _libraryElement, source, _typeProvider, errorListener,
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 3b63d6c..b975efd 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -74,7 +74,7 @@
       var leftType = node.writeType;
       if (writeElement is VariableElement) {
         leftType = _resolver.localVariableTypeProvider
-            .getType(left as SimpleIdentifier);
+            .getType(left as SimpleIdentifier, isRead: false);
       }
       _setRhsContext(node, leftType!, operator, right);
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index e4b016a..4e6836f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -18,20 +18,16 @@
 import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/type_promotion_manager.dart';
 
 /// Helper for resolving [BinaryExpression]s.
 class BinaryExpressionResolver {
   final ResolverVisitor _resolver;
-  final TypePromotionManager _promoteManager;
   final TypePropertyResolver _typePropertyResolver;
   final InvocationInferenceHelper _inferenceHelper;
 
   BinaryExpressionResolver({
     required ResolverVisitor resolver,
-    required TypePromotionManager promoteManager,
   })   : _resolver = resolver,
-        _promoteManager = promoteManager,
         _typePropertyResolver = resolver.typePropertyResolver,
         _inferenceHelper = resolver.inferenceHelper;
 
@@ -176,27 +172,16 @@
     left = node.leftOperand;
     var leftWhyNotPromoted = _resolver.flowAnalysis?.flow?.whyNotPromoted(left);
 
-    Map<DartType, NonPromotionReason> Function()? rightWhyNotPromoted;
-    if (_resolver.flowAnalysis != null) {
-      flow?.logicalBinaryOp_rightBegin(left, node, isAnd: true);
-      _resolver.checkUnreachableNode(right);
+    flow?.logicalBinaryOp_rightBegin(left, node, isAnd: true);
+    _resolver.checkUnreachableNode(right);
 
-      right.accept(_resolver);
-      right = node.rightOperand;
-      rightWhyNotPromoted = _resolver.flowAnalysis!.flow?.whyNotPromoted(right);
+    right.accept(_resolver);
+    right = node.rightOperand;
+    var rightWhyNotPromoted =
+        _resolver.flowAnalysis!.flow?.whyNotPromoted(right);
 
-      _resolver.nullSafetyDeadCodeVerifier.flowEnd(right);
-      flow?.logicalBinaryOp_end(node, right, isAnd: true);
-    } else {
-      _promoteManager.visitBinaryExpression_and_rhs(
-        left,
-        right,
-        () {
-          right.accept(_resolver);
-          right = node.rightOperand;
-        },
-      );
-    }
+    _resolver.nullSafetyDeadCodeVerifier.flowEnd(right);
+    flow?.logicalBinaryOp_end(node, right, isAnd: true);
 
     _checkNonBoolOperand(left, '&&', whyNotPromoted: leftWhyNotPromoted);
     _checkNonBoolOperand(right, '&&', whyNotPromoted: rightWhyNotPromoted);
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index 2478a00..b78323d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -39,8 +39,7 @@
 
   /// For each top level or class level declaration, the assigned variables
   /// information that was computed for it.
-  final Map<Declaration,
-          AssignedVariablesForTesting<AstNode, PromotableElement>>
+  final Map<AstNode, AssignedVariablesForTesting<AstNode, PromotableElement>>
       assignedVariables = {};
 
   /// For each expression that led to an error because it was not promoted, a
@@ -67,15 +66,21 @@
   /// The result for post-resolution stages of analysis, for testing only.
   final FlowAnalysisDataForTesting? dataForTesting;
 
+  final bool isNonNullableByDefault;
+
   /// The current flow, when resolving a function body, or `null` otherwise.
   FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>?
       flow;
 
-  FlowAnalysisHelper(TypeSystemImpl typeSystem, bool retainDataForTesting)
-      : this._(TypeSystemTypeOperations(typeSystem),
-            retainDataForTesting ? FlowAnalysisDataForTesting() : null);
+  FlowAnalysisHelper(TypeSystemImpl typeSystem, bool retainDataForTesting,
+      bool isNonNullableByDefault)
+      : this._(
+            TypeSystemTypeOperations(typeSystem),
+            retainDataForTesting ? FlowAnalysisDataForTesting() : null,
+            isNonNullableByDefault);
 
-  FlowAnalysisHelper._(this._typeOperations, this.dataForTesting);
+  FlowAnalysisHelper._(
+      this._typeOperations, this.dataForTesting, this.isNonNullableByDefault);
 
   LocalVariableTypeProvider get localVariableTypeProvider {
     return _LocalVariableTypeProvider(this);
@@ -154,11 +159,11 @@
   }
 
   void for_bodyBegin(AstNode node, Expression? condition) {
-    flow!.for_bodyBegin(node is Statement ? node : null, condition);
+    flow?.for_bodyBegin(node is Statement ? node : null, condition);
   }
 
   void for_conditionBegin(AstNode node) {
-    flow!.for_conditionBegin(node);
+    flow?.for_conditionBegin(node);
   }
 
   bool isDefinitelyAssigned(
@@ -218,7 +223,7 @@
   }
 
   void topLevelDeclaration_enter(
-      Declaration node, FormalParameterList? parameters, FunctionBody? body) {
+      AstNode node, FormalParameterList? parameters, FunctionBody? body) {
     assert(flow == null);
     assignedVariables = computeAssignedVariables(node, parameters,
         retainDataForTesting: dataForTesting != null);
@@ -226,8 +231,11 @@
       dataForTesting!.assignedVariables[node] = assignedVariables
           as AssignedVariablesForTesting<AstNode, PromotableElement>;
     }
-    flow = FlowAnalysis<AstNode, Statement, Expression, PromotableElement,
-        DartType>(_typeOperations, assignedVariables!);
+    flow = isNonNullableByDefault
+        ? FlowAnalysis<AstNode, Statement, Expression, PromotableElement,
+            DartType>(_typeOperations, assignedVariables!)
+        : FlowAnalysis<AstNode, Statement, Expression, PromotableElement,
+            DartType>.legacy(_typeOperations, assignedVariables!);
   }
 
   void topLevelDeclaration_exit() {
@@ -267,7 +275,7 @@
 
   /// Computes the [AssignedVariables] map for the given [node].
   static AssignedVariables<AstNode, PromotableElement> computeAssignedVariables(
-      Declaration node, FormalParameterList? parameters,
+      AstNode node, FormalParameterList? parameters,
       {bool retainDataForTesting = false}) {
     AssignedVariables<AstNode, PromotableElement> assignedVariables =
         retainDataForTesting
@@ -331,13 +339,13 @@
 class FlowAnalysisHelperForMigration extends FlowAnalysisHelper {
   final MigrationResolutionHooks migrationResolutionHooks;
 
-  FlowAnalysisHelperForMigration(
-      TypeSystemImpl typeSystem, this.migrationResolutionHooks)
-      : super(typeSystem, false);
+  FlowAnalysisHelperForMigration(TypeSystemImpl typeSystem,
+      this.migrationResolutionHooks, bool isNonNullableByDefault)
+      : super(typeSystem, false, isNonNullableByDefault);
 
   @override
   void topLevelDeclaration_enter(
-      Declaration node, FormalParameterList? parameters, FunctionBody? body) {
+      AstNode node, FormalParameterList? parameters, FunctionBody? body) {
     super.topLevelDeclaration_enter(node, parameters, body);
     migrationResolutionHooks.setFlowAnalysis(flow);
   }
@@ -672,10 +680,12 @@
   _LocalVariableTypeProvider(this._manager);
 
   @override
-  DartType getType(SimpleIdentifier node) {
+  DartType getType(SimpleIdentifier node, {required bool isRead}) {
     var variable = node.staticElement as VariableElement;
     if (variable is PromotableElement) {
-      var promotedType = _manager.flow?.variableRead(node, variable);
+      var promotedType = isRead
+          ? _manager.flow?.variableRead(node, variable)
+          : _manager.flow?.promotedType(variable);
       if (promotedType != null) return promotedType;
     }
     return variable.type;
diff --git a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
index 1797cfc..1c4f15f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
@@ -95,7 +95,8 @@
     if (identifier != null) {
       identifierElement = identifier.staticElement;
       if (identifierElement is VariableElement) {
-        valueType = _resolver.localVariableTypeProvider.getType(identifier);
+        valueType = _resolver.localVariableTypeProvider
+            .getType(identifier, isRead: false);
       } else if (identifierElement is PropertyAccessorElement) {
         var parameters = identifierElement.parameters;
         if (parameters.isNotEmpty) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
index abb6f0a..ed02e6a 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
@@ -13,23 +13,19 @@
 import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
 import 'package:analyzer/src/generated/migration.dart';
 import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/type_promotion_manager.dart';
 import 'package:collection/collection.dart';
 
 class FunctionExpressionResolver {
   final ResolverVisitor _resolver;
   final MigrationResolutionHooks? _migrationResolutionHooks;
   final InvocationInferenceHelper _inferenceHelper;
-  final TypePromotionManager _promoteManager;
 
   FunctionExpressionResolver({
     required ResolverVisitor resolver,
     required MigrationResolutionHooks? migrationResolutionHooks,
-    required TypePromotionManager promoteManager,
   })   : _resolver = resolver,
         _migrationResolutionHooks = migrationResolutionHooks,
-        _inferenceHelper = resolver.inferenceHelper,
-        _promoteManager = promoteManager;
+        _inferenceHelper = resolver.inferenceHelper;
 
   bool get _isNonNullableByDefault => _typeSystem.isNonNullableByDefault;
 
@@ -39,13 +35,9 @@
     var isFunctionDeclaration = node.parent is FunctionDeclaration;
     var body = node.body;
 
-    if (_resolver.flowAnalysis != null) {
-      if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
-        _resolver.flowAnalysis!
-            .executableDeclaration_enter(node, node.parameters, true);
-      }
-    } else {
-      _promoteManager.enterFunctionBody(body);
+    if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
+      _resolver.flowAnalysis!
+          .executableDeclaration_enter(node, node.parameters, true);
     }
 
     var contextType = InferenceContext.getContext(node);
@@ -63,19 +55,15 @@
     node.visitChildren(_resolver);
     _resolve2(node);
 
-    if (_resolver.flowAnalysis != null) {
-      if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
-        var bodyContext = BodyInferenceContext.of(node.body);
-        _resolver.checkForBodyMayCompleteNormally(
-          returnType: bodyContext?.contextType,
-          body: body,
-          errorNode: body,
-        );
-        _resolver.flowAnalysis!.flow?.functionExpression_end();
-        _resolver.nullSafetyDeadCodeVerifier.flowEnd(node);
-      }
-    } else {
-      _promoteManager.exitFunctionBody();
+    if (_resolver.flowAnalysis!.flow != null && !isFunctionDeclaration) {
+      var bodyContext = BodyInferenceContext.of(node.body);
+      _resolver.checkForBodyMayCompleteNormally(
+        returnType: bodyContext?.contextType,
+        body: body,
+        errorNode: body,
+      );
+      _resolver.flowAnalysis!.flow?.functionExpression_end();
+      _resolver.nullSafetyDeadCodeVerifier.flowEnd(node);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index a6ab6e7..ad2fd4f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -544,7 +544,8 @@
       }
       if (element is VariableElement) {
         _resolver.checkReadOfNotAssignedLocalVariable(nameNode, element);
-        var targetType = _localVariableTypeProvider.getType(nameNode);
+        var targetType =
+            _localVariableTypeProvider.getType(nameNode, isRead: true);
         return _rewriteAsFunctionExpressionInvocation(node, targetType);
       }
       // TODO(scheglov) This is a questionable distinction.
diff --git a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
index fb7dbb0..f1b1859 100644
--- a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
@@ -243,7 +243,8 @@
     } else if (element is TypeParameterElement) {
       staticType = _typeProvider.typeType;
     } else if (element is VariableElement) {
-      staticType = _resolver.localVariableTypeProvider.getType(node);
+      staticType = _resolver.localVariableTypeProvider
+          .getType(node, isRead: node.inGetterContext());
     } else if (element is PrefixElement) {
       var parent = node.parent;
       if (parent is PrefixedIdentifier && parent.prefix == node ||
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index a6f3800..71ca8bb 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -64,7 +64,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/static_type_analyzer.dart';
 import 'package:analyzer/src/generated/this_access_tracker.dart';
-import 'package:analyzer/src/generated/type_promotion_manager.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
 import 'package:analyzer/src/util/ast_data_extractor.dart';
 import 'package:meta/meta.dart';
@@ -233,9 +232,6 @@
   /// Otherwise `null`.
   DartType? _thisType;
 
-  /// The object keeping track of which elements have had their types promoted.
-  late final TypePromotionManager _promoteManager;
-
   final FlowAnalysisHelper? flowAnalysis;
 
   /// A comment before a function should be resolved in the context of the
@@ -314,8 +310,6 @@
         super(definingLibrary, source, typeProvider as TypeProviderImpl,
             errorListener,
             nameScope: nameScope) {
-    _promoteManager = TypePromotionManager(typeSystem);
-
     var analysisOptions =
         definingLibrary.context.analysisOptions as AnalysisOptionsImpl;
 
@@ -345,7 +339,6 @@
     );
     _binaryExpressionResolver = BinaryExpressionResolver(
       resolver: this,
-      promoteManager: _promoteManager,
     );
     _functionExpressionInvocationResolver =
         FunctionExpressionInvocationResolver(
@@ -354,7 +347,6 @@
     _functionExpressionResolver = FunctionExpressionResolver(
       resolver: this,
       migrationResolutionHooks: migrationResolutionHooks,
-      promoteManager: _promoteManager,
     );
     _forResolver = ForResolver(
       resolver: this,
@@ -396,7 +388,7 @@
     if (flowAnalysis != null) {
       return flowAnalysis!.localVariableTypeProvider;
     } else {
-      return _promoteManager.localVariableTypeProvider;
+      return const NonPromotingLocalVariableTypeProvider();
     }
   }
 
@@ -442,6 +434,7 @@
     required FunctionBody body,
     required AstNode errorNode,
   }) {
+    if (!_isNonNullableByDefault) return;
     if (!flowAnalysis!.flow!.isReachable) {
       return;
     }
@@ -630,11 +623,6 @@
     // TODO(brianwilkerson) Remove this method.
   }
 
-  /// Set the enclosing function body when partial AST is resolved.
-  void prepareCurrentFunctionBody(FunctionBody body) {
-    _promoteManager.enterFunctionBody(body);
-  }
-
   /// Set information about enclosing declarations.
   void prepareEnclosingDeclarations({
     ClassElement? enclosingClassElement,
@@ -775,7 +763,8 @@
       if (element is PropertyAccessorElement && element.isGetter) {
         readType = element.returnType;
       } else if (element is VariableElement) {
-        readType = localVariableTypeProvider.getType(node as SimpleIdentifier);
+        readType = localVariableTypeProvider.getType(node as SimpleIdentifier,
+            isRead: true);
       }
     }
 
@@ -1199,22 +1188,12 @@
     Expression thenExpression = node.thenExpression;
     InferenceContext.setTypeFromNode(thenExpression, node);
 
-    if (flowAnalysis != null) {
-      if (flow != null) {
-        flow.conditional_thenBegin(condition, node);
-        checkUnreachableNode(thenExpression);
-      }
-      thenExpression.accept(this);
-      nullSafetyDeadCodeVerifier.flowEnd(thenExpression);
-    } else {
-      _promoteManager.visitConditionalExpression_then(
-        condition,
-        thenExpression,
-        () {
-          thenExpression.accept(this);
-        },
-      );
+    if (flow != null) {
+      flow.conditional_thenBegin(condition, node);
+      checkUnreachableNode(thenExpression);
     }
+    thenExpression.accept(this);
+    nullSafetyDeadCodeVerifier.flowEnd(thenExpression);
 
     Expression elseExpression = node.elseExpression;
     InferenceContext.setTypeFromNode(elseExpression, node);
@@ -1244,33 +1223,25 @@
     var outerFunction = _enclosingFunction;
     _enclosingFunction = node.declaredElement!;
 
-    if (flowAnalysis != null) {
-      flowAnalysis!.topLevelDeclaration_enter(node, node.parameters, node.body);
-      flowAnalysis!.executableDeclaration_enter(node, node.parameters, false);
-    } else {
-      _promoteManager.enterFunctionBody(node.body);
-    }
+    flowAnalysis!.topLevelDeclaration_enter(node, node.parameters, node.body);
+    flowAnalysis!.executableDeclaration_enter(node, node.parameters, false);
 
     var returnType = _enclosingFunction!.type.returnType;
     InferenceContext.setType(node.body, returnType);
 
     super.visitConstructorDeclaration(node);
 
-    if (flowAnalysis != null) {
-      if (node.factoryKeyword != null) {
-        var bodyContext = BodyInferenceContext.of(node.body);
-        checkForBodyMayCompleteNormally(
-          returnType: bodyContext?.contextType,
-          body: node.body,
-          errorNode: node,
-        );
-      }
-      flowAnalysis!.executableDeclaration_exit(node.body, false);
-      flowAnalysis!.topLevelDeclaration_exit();
-      nullSafetyDeadCodeVerifier.flowEnd(node);
-    } else {
-      _promoteManager.exitFunctionBody();
+    if (node.factoryKeyword != null) {
+      var bodyContext = BodyInferenceContext.of(node.body);
+      checkForBodyMayCompleteNormally(
+        returnType: bodyContext?.contextType,
+        body: node.body,
+        errorNode: node,
+      );
     }
+    flowAnalysis!.executableDeclaration_exit(node.body, false);
+    flowAnalysis!.topLevelDeclaration_exit();
+    nullSafetyDeadCodeVerifier.flowEnd(node);
 
     var constructor = node.declaredElement as ConstructorElementImpl;
     constructor.constantInitializers =
@@ -1487,53 +1458,45 @@
 
     bool isLocal = node.parent is FunctionDeclarationStatement;
 
-    if (flowAnalysis != null) {
-      if (isLocal) {
-        flowAnalysis!.flow!.functionExpression_begin(node);
-      } else {
-        flowAnalysis!.topLevelDeclaration_enter(
-          node,
-          node.functionExpression.parameters,
-          node.functionExpression.body,
-        );
-      }
-      flowAnalysis!.executableDeclaration_enter(
+    if (isLocal) {
+      flowAnalysis!.flow!.functionExpression_begin(node);
+    } else {
+      flowAnalysis!.topLevelDeclaration_enter(
         node,
         node.functionExpression.parameters,
-        isLocal,
+        node.functionExpression.body,
       );
-    } else {
-      _promoteManager.enterFunctionBody(node.functionExpression.body);
     }
+    flowAnalysis!.executableDeclaration_enter(
+      node,
+      node.functionExpression.parameters,
+      isLocal,
+    );
 
     var functionType = _enclosingFunction!.type;
     InferenceContext.setType(node.functionExpression, functionType);
 
     super.visitFunctionDeclaration(node);
 
-    if (flowAnalysis != null) {
-      // TODO(scheglov) encapsulate
-      var bodyContext = BodyInferenceContext.of(
-        node.functionExpression.body,
-      );
-      checkForBodyMayCompleteNormally(
-        returnType: bodyContext?.contextType,
-        body: node.functionExpression.body,
-        errorNode: node.name,
-      );
-      flowAnalysis!.executableDeclaration_exit(
-        node.functionExpression.body,
-        isLocal,
-      );
-      if (isLocal) {
-        flowAnalysis!.flow!.functionExpression_end();
-      } else {
-        flowAnalysis!.topLevelDeclaration_exit();
-      }
-      nullSafetyDeadCodeVerifier.flowEnd(node);
+    // TODO(scheglov) encapsulate
+    var bodyContext = BodyInferenceContext.of(
+      node.functionExpression.body,
+    );
+    checkForBodyMayCompleteNormally(
+      returnType: bodyContext?.contextType,
+      body: node.functionExpression.body,
+      errorNode: node.name,
+    );
+    flowAnalysis!.executableDeclaration_exit(
+      node.functionExpression.body,
+      isLocal,
+    );
+    if (isLocal) {
+      flowAnalysis!.flow!.functionExpression_end();
     } else {
-      _promoteManager.exitFunctionBody();
+      flowAnalysis!.topLevelDeclaration_exit();
     }
+    nullSafetyDeadCodeVerifier.flowEnd(node);
 
     _enclosingFunction = outerFunction;
   }
@@ -1620,18 +1583,8 @@
         whyNotPromoted: whyNotPromoted);
 
     CollectionElement thenElement = node.thenElement;
-    if (flowAnalysis != null) {
-      flowAnalysis!.flow?.ifStatement_thenBegin(condition, node);
-      thenElement.accept(this);
-    } else {
-      _promoteManager.visitIfElement_thenElement(
-        condition,
-        thenElement,
-        () {
-          thenElement.accept(this);
-        },
-      );
-    }
+    flowAnalysis!.flow?.ifStatement_thenBegin(condition, node);
+    thenElement.accept(this);
 
     var elseElement = node.elseElement;
     if (elseElement != null) {
@@ -1661,19 +1614,9 @@
         whyNotPromoted: whyNotPromoted);
 
     Statement thenStatement = node.thenStatement;
-    if (flowAnalysis != null) {
-      flowAnalysis!.flow?.ifStatement_thenBegin(condition, node);
-      visitStatementInScope(thenStatement);
-      nullSafetyDeadCodeVerifier.flowEnd(thenStatement);
-    } else {
-      _promoteManager.visitIfStatement_thenStatement(
-        condition,
-        thenStatement,
-        () {
-          visitStatementInScope(thenStatement);
-        },
-      );
-    }
+    flowAnalysis!.flow?.ifStatement_thenBegin(condition, node);
+    visitStatementInScope(thenStatement);
+    nullSafetyDeadCodeVerifier.flowEnd(thenStatement);
 
     var elseStatement = node.elseStatement;
     if (elseStatement != null) {
@@ -1770,32 +1713,24 @@
     var outerFunction = _enclosingFunction;
     _enclosingFunction = node.declaredElement!;
 
-    if (flowAnalysis != null) {
-      flowAnalysis!.topLevelDeclaration_enter(node, node.parameters, node.body);
-      flowAnalysis!.executableDeclaration_enter(node, node.parameters, false);
-    } else {
-      _promoteManager.enterFunctionBody(node.body);
-    }
+    flowAnalysis!.topLevelDeclaration_enter(node, node.parameters, node.body);
+    flowAnalysis!.executableDeclaration_enter(node, node.parameters, false);
 
     DartType returnType = _enclosingFunction!.returnType;
     InferenceContext.setType(node.body, returnType);
 
     super.visitMethodDeclaration(node);
 
-    if (flowAnalysis != null) {
-      // TODO(scheglov) encapsulate
-      var bodyContext = BodyInferenceContext.of(node.body);
-      checkForBodyMayCompleteNormally(
-        returnType: bodyContext?.contextType,
-        body: node.body,
-        errorNode: node.name,
-      );
-      flowAnalysis!.executableDeclaration_exit(node.body, false);
-      flowAnalysis!.topLevelDeclaration_exit();
-      nullSafetyDeadCodeVerifier.flowEnd(node);
-    } else {
-      _promoteManager.exitFunctionBody();
-    }
+    // TODO(scheglov) encapsulate
+    var bodyContext = BodyInferenceContext.of(node.body);
+    checkForBodyMayCompleteNormally(
+      returnType: bodyContext?.contextType,
+      body: node.body,
+      errorNode: node.name,
+    );
+    flowAnalysis!.executableDeclaration_exit(node.body, false);
+    flowAnalysis!.topLevelDeclaration_exit();
+    nullSafetyDeadCodeVerifier.flowEnd(node);
 
     _enclosingFunction = outerFunction;
   }
@@ -2030,7 +1965,7 @@
     super.visitSwitchCase(node);
 
     var flow = flowAnalysis?.flow;
-    if (flow != null && flow.isReachable) {
+    if (flow != null && flow.isReachable && _isNonNullableByDefault) {
       var switchStatement = node.parent as SwitchStatement;
       if (switchStatement.members.last != node && node.statements.isNotEmpty) {
         errorReporter.reportErrorForToken(
@@ -2162,7 +2097,8 @@
     if (initializer != null) {
       var initializerStaticType = initializer.typeOrThrow;
       if (declaredType == null) {
-        if (initializerStaticType is TypeParameterType) {
+        if (_isNonNullableByDefault &&
+            initializerStaticType is TypeParameterType) {
           flowAnalysis?.flow?.promote(
               declaredElement as PromotableElement, initializerStaticType);
         }
@@ -2482,7 +2418,7 @@
             null,
             true,
             FlowAnalysisHelperForMigration(
-                typeSystem, migrationResolutionHooks),
+                typeSystem, migrationResolutionHooks, true),
             migrationResolutionHooks,
             migrationResolutionHooks);
 
diff --git a/pkg/analyzer/lib/src/generated/type_promotion_manager.dart b/pkg/analyzer/lib/src/generated/type_promotion_manager.dart
deleted file mode 100644
index 965b30f..0000000
--- a/pkg/analyzer/lib/src/generated/type_promotion_manager.dart
+++ /dev/null
@@ -1,388 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/generated/variable_type_provider.dart';
-
-/// Instances of the class `TypePromotionManager` manage the ability to promote
-/// types of local variables and formal parameters from their declared types
-/// based on control flow.
-class TypePromotionManager {
-  final TypeSystemImpl _typeSystem;
-
-  /// The current promotion scope.
-  _TypePromoteScope _currentScope = _TypePromoteScope(null);
-
-  final List<FunctionBody?> _functionBodyStack = [];
-
-  /// Body of the function currently being analyzed, if any.
-  FunctionBody? _currentFunctionBody;
-
-  TypePromotionManager(this._typeSystem);
-
-  LocalVariableTypeProvider get localVariableTypeProvider {
-    return _LegacyLocalVariableTypeProvider(this);
-  }
-
-  /// Returns the elements with promoted types.
-  Iterable<Element> get _promotedElements {
-    return _currentScope.promotedElements;
-  }
-
-  void enterFunctionBody(FunctionBody body) {
-    _functionBodyStack.add(_currentFunctionBody);
-    _currentFunctionBody = body;
-  }
-
-  void exitFunctionBody() {
-    if (_functionBodyStack.isEmpty) {
-      assert(false, 'exitFunctionBody without a matching enterFunctionBody');
-    } else {
-      _currentFunctionBody = _functionBodyStack.removeLast();
-    }
-  }
-
-  void visitBinaryExpression_and_rhs(
-      Expression leftOperand, Expression rightOperand, void Function() f) {
-    _enterScope();
-    try {
-      // Type promotion.
-      _promoteTypes(leftOperand);
-      _clearTypePromotionsIfPotentiallyMutatedIn(leftOperand);
-      _clearTypePromotionsIfPotentiallyMutatedIn(rightOperand);
-      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-          rightOperand);
-      // Visit right operand.
-      f();
-    } finally {
-      _exitScope();
-    }
-  }
-
-  void visitConditionalExpression_then(
-      Expression condition, Expression thenExpression, void Function() f) {
-    _enterScope();
-    try {
-      // Type promotion.
-      _promoteTypes(condition);
-      _clearTypePromotionsIfPotentiallyMutatedIn(thenExpression);
-      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-        thenExpression,
-      );
-      // Visit "then" expression.
-      f();
-    } finally {
-      _exitScope();
-    }
-  }
-
-  void visitIfElement_thenElement(
-      Expression condition, CollectionElement thenElement, void Function() f) {
-    _enterScope();
-    try {
-      // Type promotion.
-      _promoteTypes(condition);
-      _clearTypePromotionsIfPotentiallyMutatedIn(thenElement);
-      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(thenElement);
-      // Visit "then".
-      f();
-    } finally {
-      _exitScope();
-    }
-  }
-
-  void visitIfStatement_thenStatement(
-      Expression condition, Statement thenStatement, void Function() f) {
-    _enterScope();
-    try {
-      // Type promotion.
-      _promoteTypes(condition);
-      _clearTypePromotionsIfPotentiallyMutatedIn(thenStatement);
-      _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-          thenStatement);
-      // Visit "then".
-      f();
-    } finally {
-      _exitScope();
-    }
-  }
-
-  /// Checks each promoted variable in the current scope for compliance with the
-  /// following specification statement:
-  ///
-  /// If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i>
-  /// then the variable <i>v</i> is not potentially mutated anywhere in the
-  /// scope of <i>v</i>.
-  void _clearTypePromotionsIfAccessedInClosureAndPotentiallyMutated(
-      AstNode target) {
-    for (Element element in _promotedElements) {
-      if (_currentFunctionBody!
-          .isPotentiallyMutatedInScope(element as VariableElement)) {
-        if (_isVariableAccessedInClosure(element, target)) {
-          _setType(element, null);
-        }
-      }
-    }
-  }
-
-  /// Checks each promoted variable in the current scope for compliance with the
-  /// following specification statement:
-  ///
-  /// <i>v</i> is not potentially mutated in <i>s<sub>1</sub></i> or within a
-  /// closure.
-  void _clearTypePromotionsIfPotentiallyMutatedIn(AstNode target) {
-    for (Element element in _promotedElements) {
-      if (_isVariablePotentiallyMutatedIn(element, target)) {
-        _setType(element, null);
-      }
-    }
-  }
-
-  /// Enter a new promotions scope.
-  void _enterScope() {
-    _currentScope = _TypePromoteScope(_currentScope);
-  }
-
-  /// Exit the current promotion scope.
-  void _exitScope() {
-    var outerScope = _currentScope._outerScope;
-    if (outerScope == null) {
-      throw StateError("No scope to exit");
-    }
-    _currentScope = outerScope;
-  }
-
-  /// Return the promoted type of the given [element], or `null` if the type of
-  /// the element has not been promoted.
-  DartType? _getPromotedType(Element element) {
-    return _currentScope.getType(element);
-  }
-
-  /// Return the static element associated with the given expression whose type
-  /// can be promoted, or `null` if there is no element whose type can be
-  /// promoted.
-  VariableElement? _getPromotionStaticElement(Expression expression) {
-    expression = expression.unParenthesized;
-    if (expression is SimpleIdentifier) {
-      var element = expression.staticElement;
-      if (element is VariableElement) {
-        ElementKind kind = element.kind;
-        if (kind == ElementKind.LOCAL_VARIABLE ||
-            kind == ElementKind.PARAMETER) {
-          return element;
-        }
-      }
-    }
-    return null;
-  }
-
-  /// Given that the [node] is a reference to a [VariableElement], return the
-  /// static type of the variable at this node - declared or promoted.
-  DartType _getType(SimpleIdentifier node) {
-    var variable = node.staticElement as VariableElement;
-    return _getPromotedType(variable) ?? variable.type;
-  }
-
-  /// Return `true` if the given variable is accessed within a closure in the
-  /// given [AstNode] and also mutated somewhere in variable scope. This
-  /// information is only available for local variables (including parameters).
-  ///
-  /// @param variable the variable to check
-  /// @param target the [AstNode] to check within
-  /// @return `true` if this variable is potentially mutated somewhere in the
-  ///         given ASTNode
-  bool _isVariableAccessedInClosure(Element variable, AstNode target) {
-    _ResolverVisitor_isVariableAccessedInClosure visitor =
-        _ResolverVisitor_isVariableAccessedInClosure(variable);
-    target.accept(visitor);
-    return visitor.result;
-  }
-
-  /// Return `true` if the given variable is potentially mutated somewhere in
-  /// the given [AstNode]. This information is only available for local
-  /// variables (including parameters).
-  ///
-  /// @param variable the variable to check
-  /// @param target the [AstNode] to check within
-  /// @return `true` if this variable is potentially mutated somewhere in the
-  ///         given ASTNode
-  bool _isVariablePotentiallyMutatedIn(Element variable, AstNode target) {
-    _ResolverVisitor_isVariablePotentiallyMutatedIn visitor =
-        _ResolverVisitor_isVariablePotentiallyMutatedIn(variable);
-    target.accept(visitor);
-    return visitor.result;
-  }
-
-  /// If it is appropriate to do so, promotes the current type of the static
-  /// element associated with the given expression with the given type.
-  /// Generally speaking, it is appropriate if the given type is more specific
-  /// than the current type.
-  ///
-  /// @param expression the expression used to access the static element whose
-  ///        types might be promoted
-  /// @param potentialType the potential type of the elements
-  void _promote(Expression expression, DartType potentialType) {
-    var element = _getPromotionStaticElement(expression);
-    if (element != null) {
-      // may be mutated somewhere in closure
-      if (_currentFunctionBody!.isPotentiallyMutatedInClosure(element)) {
-        return;
-      }
-      // prepare current variable type
-      DartType type = _getPromotedType(element) ?? expression.typeOrThrow;
-
-      // Check if we can promote to potentialType from type.
-      var promoteType = _typeSystem.tryPromoteToType(potentialType, type);
-      if (promoteType != null) {
-        // Do promote type of variable.
-        _setType(element, promoteType);
-      }
-    }
-  }
-
-  /// Promotes type information using given condition.
-  void _promoteTypes(Expression condition) {
-    if (condition is BinaryExpression) {
-      if (condition.operator.type == TokenType.AMPERSAND_AMPERSAND) {
-        Expression left = condition.leftOperand;
-        Expression right = condition.rightOperand;
-        _promoteTypes(left);
-        _promoteTypes(right);
-        _clearTypePromotionsIfPotentiallyMutatedIn(right);
-      }
-    } else if (condition is IsExpression) {
-      if (condition.notOperator == null) {
-        _promote(condition.expression, condition.type.typeOrThrow);
-      }
-    } else if (condition is ParenthesizedExpression) {
-      _promoteTypes(condition.expression);
-    }
-  }
-
-  /// Set the promoted type of the given element to the given type.
-  ///
-  /// @param element the element whose type might have been promoted
-  /// @param type the promoted type of the given element
-  void _setType(Element element, DartType? type) {
-    if (_currentScope._outerScope == null) {
-      throw StateError("Cannot promote without a scope");
-    }
-    _currentScope.setType(element, type);
-  }
-}
-
-/// The legacy, pre-NNBD implementation of [LocalVariableTypeProvider].
-class _LegacyLocalVariableTypeProvider implements LocalVariableTypeProvider {
-  final TypePromotionManager _manager;
-
-  _LegacyLocalVariableTypeProvider(this._manager);
-
-  @override
-  DartType getType(SimpleIdentifier node) {
-    return _manager._getType(node);
-  }
-}
-
-class _ResolverVisitor_isVariableAccessedInClosure
-    extends RecursiveAstVisitor<void> {
-  final Element variable;
-
-  bool result = false;
-
-  bool _inClosure = false;
-
-  _ResolverVisitor_isVariableAccessedInClosure(this.variable);
-
-  @override
-  void visitFunctionExpression(FunctionExpression node) {
-    bool inClosure = _inClosure;
-    try {
-      _inClosure = true;
-      super.visitFunctionExpression(node);
-    } finally {
-      _inClosure = inClosure;
-    }
-  }
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (result) {
-      return;
-    }
-    if (_inClosure && identical(node.staticElement, variable)) {
-      result = true;
-    }
-  }
-}
-
-class _ResolverVisitor_isVariablePotentiallyMutatedIn
-    extends RecursiveAstVisitor<void> {
-  final Element variable;
-
-  bool result = false;
-
-  _ResolverVisitor_isVariablePotentiallyMutatedIn(this.variable);
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    if (result) {
-      return;
-    }
-    if (identical(node.staticElement, variable)) {
-      if (node.inSetterContext()) {
-        result = true;
-      }
-    }
-  }
-}
-
-/// Instances of the class `TypePromoteScope` represent a scope in which the
-/// types of elements can be promoted.
-class _TypePromoteScope {
-  /// The outer scope in which types might be promoted.
-  final _TypePromoteScope? _outerScope;
-
-  /// A table mapping elements to the promoted type of that element.
-  final Map<Element, DartType?> _promotedTypes = {};
-
-  /// Initialize a newly created scope to be an empty child of the given scope.
-  ///
-  /// @param outerScope the outer scope in which types might be promoted
-  _TypePromoteScope(this._outerScope);
-
-  /// Returns the elements with promoted types.
-  Iterable<Element> get promotedElements => _promotedTypes.keys.toSet();
-
-  /// Return the promoted type of the given element, or `null` if the type of
-  /// the element has not been promoted.
-  ///
-  /// @param element the element whose type might have been promoted
-  /// @return the promoted type of the given element
-  DartType? getType(Element element) {
-    var type = _promotedTypes[element];
-    if (type == null && element is PropertyAccessorElement) {
-      type = _promotedTypes[element.variable];
-    }
-    if (type != null) {
-      return type;
-    } else if (_outerScope != null) {
-      return _outerScope!.getType(element);
-    }
-    return null;
-  }
-
-  /// Set the promoted type of the given element to the given type.
-  ///
-  /// @param element the element whose type might have been promoted
-  /// @param type the promoted type of the given element
-  void setType(Element element, DartType? type) {
-    _promotedTypes[element] = type;
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/variable_type_provider.dart b/pkg/analyzer/lib/src/generated/variable_type_provider.dart
index 376d102..4258443 100644
--- a/pkg/analyzer/lib/src/generated/variable_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/variable_type_provider.dart
@@ -3,11 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 
 /// Provider of types for local variables and formal parameters.
 abstract class LocalVariableTypeProvider {
   /// Given that the [node] is a reference to a local variable, or a parameter,
   /// return the type of the variable at the node - declared or promoted.
-  DartType getType(SimpleIdentifier node);
+  DartType getType(SimpleIdentifier node, {required bool isRead});
+}
+
+/// Implementation of [LocalVariableTypeProvider] that does not promote, for use
+/// in situations where no flow analysis is being done.  This happens in some
+/// analyzer internal unit tests.
+class NonPromotingLocalVariableTypeProvider
+    implements LocalVariableTypeProvider {
+  const NonPromotingLocalVariableTypeProvider();
+
+  @override
+  DartType getType(SimpleIdentifier node, {required bool isRead}) =>
+      (node.staticElement as VariableElement).type;
 }
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index 85a2151..3be65c2 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -53,16 +53,12 @@
       node.accept(variableResolverVisitor);
     }
 
-    FlowAnalysisHelper? flowAnalysis;
+    FlowAnalysisHelper flowAnalysis = FlowAnalysisHelper(
+        _unitElement.library.typeSystem,
+        false,
+        _unitElement.library.isNonNullableByDefault);
     if (isTopLevelVariableInitializer) {
-      if (_unitElement.library.isNonNullableByDefault) {
-        flowAnalysis = FlowAnalysisHelper(
-          _unitElement.library.typeSystem,
-          false,
-        );
-        flowAnalysis.topLevelDeclaration_enter(
-            node.parent as Declaration, null, null);
-      }
+      flowAnalysis.topLevelDeclaration_enter(node.parent!, null, null);
     }
 
     var resolverVisitor = ResolverVisitor(
@@ -80,14 +76,11 @@
       enclosingClassElement: enclosingClassElement,
       enclosingExecutableElement: enclosingExecutableElement,
     );
-    if (enclosingFunctionBody != null) {
-      resolverVisitor.prepareCurrentFunctionBody(enclosingFunctionBody);
-    }
 
     node.accept(resolverVisitor);
 
     if (isTopLevelVariableInitializer) {
-      flowAnalysis?.topLevelDeclaration_exit();
+      flowAnalysis.topLevelDeclaration_exit();
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 9566af2..f5d81ef 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -119,6 +119,7 @@
       },
       enclosingClassElement: _classElement,
       enclosingExecutableElement: _executableElement,
+      isTopLevelVariableInitializer: true,
     );
   }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 4b2720b..a7659a2 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -799,23 +799,15 @@
           for (VariableDeclaration parameter
               in member.function.positionalParameters) {
             inferrer.flowAnalysis?.declare(parameter, true);
-            positionalArguments.add(new VariableGetImpl(
-                parameter,
-                inferrer.typePromoter.getFactForAccess(parameter, 0),
-                inferrer.typePromoter.currentScope,
-                forNullGuardedAccess: false));
+            positionalArguments.add(
+                new VariableGetImpl(parameter, forNullGuardedAccess: false));
           }
           List<NamedExpression> namedArguments = <NamedExpression>[];
           for (VariableDeclaration parameter
               in member.function.namedParameters) {
             inferrer.flowAnalysis?.declare(parameter, true);
-            namedArguments.add(new NamedExpression(
-                parameter.name,
-                new VariableGetImpl(
-                    parameter,
-                    inferrer.typePromoter.getFactForAccess(parameter, 0),
-                    inferrer.typePromoter.currentScope,
-                    forNullGuardedAccess: false)));
+            namedArguments.add(new NamedExpression(parameter.name,
+                new VariableGetImpl(parameter, forNullGuardedAccess: false)));
           }
           // If arguments are created using [Forest.createArguments], and the
           // type arguments are omitted, they are to be inferred.
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 93ee6da..db9c9ed 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -161,10 +161,13 @@
     // explicitly specified as Object, in which case defaultType should also be
     // Object. This makes sure instantiation of generic function types with an
     // explicit Object bound results in Object as the instantiated type.
-    parameter.defaultType ??= defaultType?.build(library) ??
-        (bound != null && parameter.bound == objectType
-            ? objectType
-            : dynamicType.build(library));
+    if (identical(
+        parameter.defaultType, TypeParameter.unsetDefaultTypeSentinel)) {
+      parameter.defaultType = defaultType?.build(library) ??
+          (bound != null && parameter.bound == objectType
+              ? objectType
+              : dynamicType.build(library));
+    }
   }
 
   void applyPatch(covariant TypeVariableBuilder patch) {
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 8fc537e..3f3cf82 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -110,9 +110,6 @@
 import '../type_inference/type_inferrer.dart'
     show TypeInferrer, InferredFunctionBody;
 
-import '../type_inference/type_promotion.dart'
-    show TypePromoter, TypePromotionFact, TypePromotionScope;
-
 import '../type_inference/type_schema.dart' show UnknownType;
 
 import '../util/helpers.dart' show DelayedActionPerformer;
@@ -202,8 +199,6 @@
 
   final TypeInferrer typeInferrer;
 
-  final TypePromoter typePromoter;
-
   /// Only used when [member] is a constructor. It tracks if an implicit super
   /// initializer is needed.
   ///
@@ -375,7 +370,6 @@
                     libraryBuilder.importUri.path == "ui"),
         needsImplicitSuperInitializer = declarationBuilder is ClassBuilder &&
             coreTypes?.objectClass != declarationBuilder.cls,
-        typePromoter = typeInferrer?.typePromoter,
         super(enclosingScope) {
     formalParameterScope?.forEach((String name, Builder builder) {
       if (builder is VariableBuilder) {
@@ -463,7 +457,6 @@
 
   @override
   void registerVariableAssignment(VariableDeclaration variable) {
-    typePromoter?.mutateVariable(variable, functionNestingLevel);
     typeInferrer?.assignedVariables?.write(variable);
   }
 
@@ -948,7 +941,6 @@
   void finishFunction(
       FormalParameters formals, AsyncMarker asyncModifier, Statement body) {
     debugEvent("finishFunction");
-    typePromoter?.finished();
     typeInferrer?.assignedVariables?.finish();
 
     FunctionBuilder builder = member;
@@ -1791,7 +1783,6 @@
     bool isAnd = optional("&&", token);
     if (isAnd || optional("||", token)) {
       Expression lhs = popForValue();
-      typePromoter?.enterLogicalExpression(lhs, token.stringValue);
       // This is matched by the call to [endNode] in
       // [doLogicalExpression].
       if (isAnd) {
@@ -1879,7 +1870,6 @@
     Expression receiver = pop();
     Expression logicalExpression = forest.createLogicalExpression(
         offsetForToken(token), receiver, token.stringValue, argument);
-    typePromoter?.exitLogicalExpression(argument, logicalExpression);
     push(logicalExpression);
     if (optional("&&", token)) {
       // This is matched by the call to [beginNode] in
@@ -2105,10 +2095,7 @@
     if (!(variable as VariableDeclarationImpl).isLocalFunction) {
       typeInferrer?.assignedVariables?.read(variable);
     }
-    Object fact =
-        typePromoter?.getFactForAccess(variable, functionNestingLevel);
-    Object scope = typePromoter?.currentScope;
-    return new VariableGetImpl(variable, fact, scope,
+    return new VariableGetImpl(variable,
         forNullGuardedAccess: forNullGuardedAccess)
       ..fileOffset = charOffset;
   }
@@ -2472,7 +2459,6 @@
   @override
   void beginThenStatement(Token token) {
     Expression condition = popForValue();
-    enterThenForTypePromotion(condition);
     // This is matched by the call to [deferNode] in
     // [endThenStatement].
     typeInferrer?.assignedVariables?.beginNode();
@@ -2482,7 +2468,6 @@
 
   @override
   void endThenStatement(Token token) {
-    typePromoter?.enterElse();
     super.endThenStatement(token);
     // This is matched by the call to [beginNode] in
     // [beginThenStatement] and by the call to [storeInfo] in
@@ -2497,7 +2482,6 @@
         pop();
     Statement thenPart = popStatement();
     Expression condition = pop();
-    typePromoter?.exitConditional();
     Statement node = forest.createIfStatement(
         offsetForToken(ifToken), condition, thenPart, elsePart);
     // This is matched by the call to [deferNode] in
@@ -3535,24 +3519,18 @@
     DartType type = buildDartType(pop(),
         allowPotentiallyConstantType: libraryBuilder.isNonNullableByDefault);
     Expression operand = popForValue();
-    bool isInverted = not != null;
     Expression isExpression = forest.createIsExpression(
         offsetForToken(isOperator), operand, type,
         forNonNullableByDefault: libraryBuilder.isNonNullableByDefault,
         notFileOffset: not != null ? offsetForToken(not) : null);
     libraryBuilder.checkBoundsInType(
         type, typeEnvironment, uri, isOperator.charOffset);
-    if (operand is VariableGet) {
-      typePromoter?.handleIsCheck(isExpression, isInverted, operand.variable,
-          type, functionNestingLevel);
-    }
     push(isExpression);
   }
 
   @override
   void beginConditionalExpression(Token question) {
     Expression condition = popForValue();
-    typePromoter?.enterThen(condition);
     // This is matched by the call to [deferNode] in
     // [handleConditionalExpressionColon].
     typeInferrer?.assignedVariables?.beginNode();
@@ -3563,7 +3541,6 @@
   @override
   void handleConditionalExpressionColon() {
     Expression then = popForValue();
-    typePromoter?.enterElse();
     // This is matched by the call to [beginNode] in
     // [beginConditionalExpression] and by the call to [storeInfo] in
     // [endConditionalExpression].
@@ -3580,7 +3557,6 @@
     AssignedVariablesNodeInfo<VariableDeclaration> assignedVariablesInfo =
         pop();
     Expression condition = pop();
-    typePromoter?.exitConditional();
     Expression node = forest.createConditionalExpression(
         offsetForToken(question), condition, thenExpression, elseExpression);
     push(node);
@@ -4791,7 +4767,6 @@
   @override
   void handleThenControlFlow(Token token) {
     Expression condition = popForValue();
-    enterThenForTypePromotion(condition);
     // This is matched by the call to [deferNode] in
     // [handleElseControlFlow] and by the call to [endNode] in
     // [endIfControlFlow].
@@ -4811,7 +4786,6 @@
     // [endIfElseControlFlow].
     push(typeInferrer?.assignedVariables?.deferNode());
     push(node);
-    typePromoter?.enterElse();
   }
 
   @override
@@ -4831,8 +4805,6 @@
           offsetForToken(ifToken), toValue(condition), toValue(entry));
     }
     push(node);
-    typePromoter?.enterElse();
-    typePromoter?.exitConditional();
     // This is matched by the call to [beginNode] in
     // [handleThenControlFlow].
     typeInferrer?.assignedVariables?.endNode(node);
@@ -4847,7 +4819,6 @@
         pop();
     Object condition = pop(); // parenthesized expression
     Token ifToken = pop();
-    typePromoter?.exitConditional();
 
     transformCollections = true;
     TreeNode node;
@@ -5343,12 +5314,8 @@
         ///       lvalue = #t;
         ///       body;
         ///     }
-        TypePromotionFact fact =
-            typePromoter?.getFactForAccess(variable, functionNestingLevel);
-        TypePromotionScope scope = typePromoter?.currentScope;
         elements.syntheticAssignment = lvalue.buildAssignment(
-            new VariableGetImpl(variable, fact, scope,
-                forNullGuardedAccess: false)
+            new VariableGetImpl(variable, forNullGuardedAccess: false)
               ..fileOffset = inToken.offset,
             voidContext: true);
       } else {
@@ -6560,12 +6527,6 @@
     return new DeferredCheck(check, expression)..fileOffset = charOffset;
   }
 
-  /// TODO(ahe): This method is temporarily implemented. Once type promotion is
-  /// independent of shadow nodes, remove this method.
-  void enterThenForTypePromotion(Expression condition) {
-    typePromoter?.enterThen(condition);
-  }
-
   bool isErroneousNode(TreeNode node) {
     return libraryBuilder.loader.handledErrors.isNotEmpty &&
         forest.isErroneousNode(node);
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index e2fb85b..b29d126 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -48,10 +48,11 @@
   /// Returns this control flow element as a [MapEntry], or `null` if this
   /// control flow element cannot be converted into a [MapEntry].
   ///
-  /// [onConvertForElement] is called when a [ForElement] or [ForInElement] is
-  /// converted to a [ForMapEntry] or [ForInMapEntry], respectively.
+  /// [onConvertElement] is called when a [ForElement], [ForInElement], or
+  /// [IfElement] is converted to a [ForMapEntry], [ForInMapEntry], or
+  /// [IfMapEntry], respectively.
   // TODO(johnniwinther): Merge this with [convertToMapEntry].
-  MapEntry toMapEntry(void onConvertForElement(TreeNode from, TreeNode to));
+  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to));
 }
 
 /// A spread element in a list or set literal.
@@ -91,8 +92,7 @@
   }
 
   @override
-  SpreadMapEntry toMapEntry(
-      void onConvertForElement(TreeNode from, TreeNode to)) {
+  SpreadMapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
     return new SpreadMapEntry(expression, isNullAware)..fileOffset = fileOffset;
   }
 
@@ -163,23 +163,25 @@
   }
 
   @override
-  MapEntry toMapEntry(void onConvertForElement(TreeNode from, TreeNode to)) {
+  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
     MapEntry thenEntry;
     if (then is ControlFlowElement) {
       ControlFlowElement thenElement = then;
-      thenEntry = thenElement.toMapEntry(onConvertForElement);
+      thenEntry = thenElement.toMapEntry(onConvertElement);
     }
     if (thenEntry == null) return null;
     MapEntry otherwiseEntry;
     if (otherwise != null) {
       if (otherwise is ControlFlowElement) {
         ControlFlowElement otherwiseElement = otherwise;
-        otherwiseEntry = otherwiseElement.toMapEntry(onConvertForElement);
+        otherwiseEntry = otherwiseElement.toMapEntry(onConvertElement);
       }
       if (otherwiseEntry == null) return null;
     }
-    return new IfMapEntry(condition, thenEntry, otherwiseEntry)
+    IfMapEntry result = new IfMapEntry(condition, thenEntry, otherwiseEntry)
       ..fileOffset = fileOffset;
+    onConvertElement(this, result);
+    return result;
   }
 
   @override
@@ -251,17 +253,17 @@
   }
 
   @override
-  MapEntry toMapEntry(void onConvertForElement(TreeNode from, TreeNode to)) {
+  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
     MapEntry bodyEntry;
     if (body is ControlFlowElement) {
       ControlFlowElement bodyElement = body;
-      bodyEntry = bodyElement.toMapEntry(onConvertForElement);
+      bodyEntry = bodyElement.toMapEntry(onConvertElement);
     }
     if (bodyEntry == null) return null;
     ForMapEntry result =
         new ForMapEntry(variables, condition, updates, bodyEntry)
           ..fileOffset = fileOffset;
-    onConvertForElement(this, result);
+    onConvertElement(this, result);
     return result;
   }
 
@@ -367,18 +369,18 @@
   }
 
   @override
-  MapEntry toMapEntry(void onConvertForElement(TreeNode from, TreeNode to)) {
+  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
     MapEntry bodyEntry;
     if (body is ControlFlowElement) {
       ControlFlowElement bodyElement = body;
-      bodyEntry = bodyElement.toMapEntry(onConvertForElement);
+      bodyEntry = bodyElement.toMapEntry(onConvertElement);
     }
     if (bodyEntry == null) return null;
     ForInMapEntry result = new ForInMapEntry(variable, iterable,
         syntheticAssignment, expressionEffects, bodyEntry, problem,
         isAsync: isAsync)
       ..fileOffset = fileOffset;
-    onConvertForElement(this, result);
+    onConvertElement(this, result);
     return result;
   }
 
@@ -707,31 +709,31 @@
 /// converted an error reported through [helper] and an invalid expression is
 /// returned.
 ///
-/// [onConvertForMapEntry] is called when a [ForMapEntry] or [ForInMapEntry] is
-/// converted to a [ForElement] or [ForInElement], respectively.
+/// [onConvertMapEntry] is called when a [ForMapEntry], [ForInMapEntry], or
+/// [IfMapEntry] is converted to a [ForElement], [ForInElement], or [IfElement],
+/// respectively.
 Expression convertToElement(MapEntry entry, InferenceHelper helper,
-    void onConvertForMapEntry(TreeNode from, TreeNode to)) {
+    void onConvertMapEntry(TreeNode from, TreeNode to)) {
   if (entry is SpreadMapEntry) {
     return new SpreadElement(entry.expression, entry.isNullAware)
       ..fileOffset = entry.expression.fileOffset;
   }
   if (entry is IfMapEntry) {
-    return new IfElement(
+    IfElement result = new IfElement(
         entry.condition,
-        convertToElement(entry.then, helper, onConvertForMapEntry),
+        convertToElement(entry.then, helper, onConvertMapEntry),
         entry.otherwise == null
             ? null
-            : convertToElement(entry.otherwise, helper, onConvertForMapEntry))
+            : convertToElement(entry.otherwise, helper, onConvertMapEntry))
       ..fileOffset = entry.fileOffset;
+    onConvertMapEntry(entry, result);
+    return result;
   }
   if (entry is ForMapEntry) {
-    ForElement result = new ForElement(
-        entry.variables,
-        entry.condition,
-        entry.updates,
-        convertToElement(entry.body, helper, onConvertForMapEntry))
+    ForElement result = new ForElement(entry.variables, entry.condition,
+        entry.updates, convertToElement(entry.body, helper, onConvertMapEntry))
       ..fileOffset = entry.fileOffset;
-    onConvertForMapEntry(entry, result);
+    onConvertMapEntry(entry, result);
     return result;
   }
   if (entry is ForInMapEntry) {
@@ -740,11 +742,11 @@
         entry.iterable,
         entry.syntheticAssignment,
         entry.expressionEffects,
-        convertToElement(entry.body, helper, onConvertForMapEntry),
+        convertToElement(entry.body, helper, onConvertMapEntry),
         entry.problem,
         isAsync: entry.isAsync)
       ..fileOffset = entry.fileOffset;
-    onConvertForMapEntry(entry, result);
+    onConvertMapEntry(entry, result);
     return result;
   }
   Expression key = entry.key;
@@ -782,31 +784,34 @@
 /// converted an error reported through [helper] and a map entry holding an
 /// invalid expression is returned.
 ///
-/// [onConvertForElement] is called when a [ForElement] or [ForInElement] is
-/// converted to a [ForMapEntry] or [ForInMapEntry], respectively.
+/// [onConvertElement] is called when a [ForElement], [ForInElement], or
+/// [IfElement] is converted to a [ForMapEntry], [ForInMapEntry], or
+/// [IfMapEntry], respectively.
 MapEntry convertToMapEntry(Expression element, InferenceHelper helper,
-    void onConvertForElement(TreeNode from, TreeNode to)) {
+    void onConvertElement(TreeNode from, TreeNode to)) {
   if (element is SpreadElement) {
     return new SpreadMapEntry(element.expression, element.isNullAware)
       ..fileOffset = element.expression.fileOffset;
   }
   if (element is IfElement) {
-    return new IfMapEntry(
+    IfMapEntry result = new IfMapEntry(
         element.condition,
-        convertToMapEntry(element.then, helper, onConvertForElement),
+        convertToMapEntry(element.then, helper, onConvertElement),
         element.otherwise == null
             ? null
-            : convertToMapEntry(element.otherwise, helper, onConvertForElement))
+            : convertToMapEntry(element.otherwise, helper, onConvertElement))
       ..fileOffset = element.fileOffset;
+    onConvertElement(element, result);
+    return result;
   }
   if (element is ForElement) {
     ForMapEntry result = new ForMapEntry(
         element.variables,
         element.condition,
         element.updates,
-        convertToMapEntry(element.body, helper, onConvertForElement))
+        convertToMapEntry(element.body, helper, onConvertElement))
       ..fileOffset = element.fileOffset;
-    onConvertForElement(element, result);
+    onConvertElement(element, result);
     return result;
   }
   if (element is ForInElement) {
@@ -815,11 +820,11 @@
         element.iterable,
         element.syntheticAssignment,
         element.expressionEffects,
-        convertToMapEntry(element.body, helper, onConvertForElement),
+        convertToMapEntry(element.body, helper, onConvertElement),
         element.problem,
         isAsync: element.isAsync)
       ..fileOffset = element.fileOffset;
-    onConvertForElement(element, result);
+    onConvertElement(element, result);
     return result;
   }
   return new MapEntry(
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 3e36973..20a67a7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -6545,7 +6545,8 @@
     if (initializerResult != null) {
       DartType initializerType = initializerResult.inferredType;
       if (node.isImplicitlyTyped) {
-        if (initializerType is TypeParameterType) {
+        if (inferrer.isNonNullableByDefault &&
+            initializerType is TypeParameterType) {
           inferrer.flowAnalysis.promote(node, initializerType);
         }
       } else {
@@ -6735,20 +6736,14 @@
     DartType declaredOrInferredType = variable.lateType ?? variable.type;
     if (isExtensionThis(variable)) {
       inferrer.flowAnalysis.thisOrSuper(node, variable.type);
-    } else if (inferrer.isNonNullableByDefault) {
-      if (node.forNullGuardedAccess) {
-        DartType nonNullableType = variable.type.toNonNull();
-        if (nonNullableType != variable.type) {
-          promotedType = nonNullableType;
-        }
-      } else if (!variable.isLocalFunction) {
-        // Don't promote local functions.
-        promotedType = inferrer.flowAnalysis.variableRead(node, variable);
+    } else if (inferrer.isNonNullableByDefault && node.forNullGuardedAccess) {
+      DartType nonNullableType = variable.type.toNonNull();
+      if (nonNullableType != variable.type) {
+        promotedType = nonNullableType;
       }
-    } else {
-      bool mutatedInClosure = variable.mutatedInClosure;
-      promotedType = inferrer.typePromoter
-          .computePromotedType(node.fact, node.scope, mutatedInClosure);
+    } else if (!variable.isLocalFunction) {
+      // Don't promote local functions.
+      promotedType = inferrer.flowAnalysis.variableRead(node, variable);
     }
     if (promotedType != null) {
       inferrer.instrumentation?.record(
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 35da3d2..46afae9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -40,14 +40,8 @@
 import '../type_inference/type_inference_engine.dart';
 import '../type_inference/type_inferrer.dart';
 
-import '../type_inference/type_promotion.dart'
-    show TypePromoter, TypePromoterImpl, TypePromotionFact, TypePromotionScope;
-
 import '../type_inference/type_schema.dart' show UnknownType;
 
-import '../type_inference/type_schema_environment.dart'
-    show TypeSchemaEnvironment;
-
 import 'inference_visitor.dart';
 
 /// Computes the return type of a (possibly factory) constructor.
@@ -1449,50 +1443,6 @@
   }
 }
 
-/// Concrete implementation of [TypePromoter] specialized to work with kernel
-/// objects.
-class ShadowTypePromoter extends TypePromoterImpl {
-  ShadowTypePromoter.private(TypeSchemaEnvironment typeSchemaEnvironment)
-      : super.private(typeSchemaEnvironment);
-
-  @override
-  int getVariableFunctionNestingLevel(VariableDeclaration variable) {
-    if (variable is VariableDeclarationImpl) {
-      return variable.functionNestingLevel;
-    } else {
-      // Hack to deal with the fact that BodyBuilder still creates raw
-      // VariableDeclaration objects sometimes.
-      // TODO(paulberry): get rid of this once the type parameter is
-      // KernelVariableDeclaration.
-      return 0;
-    }
-  }
-
-  @override
-  bool isPromotionCandidate(VariableDeclaration variable) {
-    assert(variable is VariableDeclarationImpl);
-    VariableDeclarationImpl kernelVariableDeclaration = variable;
-    return !kernelVariableDeclaration.isLocalFunction;
-  }
-
-  @override
-  bool sameExpressions(Expression a, Expression b) {
-    return identical(a, b);
-  }
-
-  @override
-  void setVariableMutatedInClosure(VariableDeclaration variable) {
-    if (variable is VariableDeclarationImpl) {
-      variable.mutatedInClosure = true;
-    } else {
-      // Hack to deal with the fact that BodyBuilder still creates raw
-      // VariableDeclaration objects sometimes.
-      // TODO(paulberry): get rid of this once the type parameter is
-      // KernelVariableDeclaration.
-    }
-  }
-}
-
 /// Front end specific implementation of [VariableDeclaration].
 class VariableDeclarationImpl extends VariableDeclaration {
   final bool forSyntheticToken;
@@ -1635,16 +1585,11 @@
 
 /// Front end specific implementation of [VariableGet].
 class VariableGetImpl extends VariableGet {
-  final TypePromotionFact fact;
-
-  final TypePromotionScope scope;
-
   // TODO(johnniwinther): Remove the need for this by encoding all null aware
   // expressions explicitly.
   final bool forNullGuardedAccess;
 
-  VariableGetImpl(VariableDeclaration variable, this.fact, this.scope,
-      {this.forNullGuardedAccess})
+  VariableGetImpl(VariableDeclaration variable, {this.forNullGuardedAccess})
       : assert(forNullGuardedAccess != null),
         super(variable);
 
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 eafc3e4..aa896d9 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
@@ -59,8 +59,6 @@
 
 import 'type_inference_engine.dart';
 
-import 'type_promotion.dart' show TypePromoter;
-
 import 'type_schema.dart' show isKnown, UnknownType;
 
 import 'type_schema_elimination.dart' show greatestClosure;
@@ -123,10 +121,6 @@
 abstract class TypeInferrer {
   SourceLibraryBuilder get library;
 
-  /// Gets the [TypePromoter] that can be used to perform type promotion within
-  /// this method body or initializer.
-  TypePromoter get typePromoter;
-
   /// Gets the [TypeSchemaEnvironment] being used for type inference.
   TypeSchemaEnvironment get typeSchemaEnvironment;
 
@@ -183,9 +177,6 @@
 
   final TypeInferenceEngine engine;
 
-  @override
-  final TypePromoter typePromoter;
-
   final FlowAnalysis<TreeNode, Statement, Expression, VariableDeclaration,
       DartType> flowAnalysis;
 
@@ -227,10 +218,13 @@
         instrumentation = topLevel ? null : engine.instrumentation,
         typeSchemaEnvironment = engine.typeSchemaEnvironment,
         isTopLevel = topLevel,
-        typePromoter = new TypePromoter(engine.typeSchemaEnvironment),
-        flowAnalysis = new FlowAnalysis(
-            new TypeOperationsCfe(engine.typeSchemaEnvironment),
-            assignedVariables);
+        flowAnalysis = library.isNonNullableByDefault
+            ? new FlowAnalysis(
+                new TypeOperationsCfe(engine.typeSchemaEnvironment),
+                assignedVariables)
+            : new FlowAnalysis.legacy(
+                new TypeOperationsCfe(engine.typeSchemaEnvironment),
+                assignedVariables);
 
   CoreTypes get coreTypes => engine.coreTypes;
 
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
deleted file mode 100644
index f94934e..0000000
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ /dev/null
@@ -1,704 +0,0 @@
-// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-// @dart = 2.9
-
-import 'package:kernel/ast.dart'
-    show DartType, Expression, TypeParameterType, VariableDeclaration;
-
-import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
-
-import '../fasta_codes.dart' show templateInternalProblemStackNotEmpty;
-
-import '../problems.dart' show internalProblem;
-
-import '../kernel/internal_ast.dart' show ShadowTypePromoter;
-
-import 'type_schema_environment.dart' show TypeSchemaEnvironment;
-
-/// Keeps track of the state necessary to perform type promotion.
-///
-/// Theory of operation: during parsing, the BodyBuilder calls methods in this
-/// class to inform it of syntactic constructs that are encountered.  Those
-/// methods maintain a linked list of [TypePromotionFact] objects tracking what
-/// is known about the state of each variable at the current point in the code,
-/// as well as a linked list of [TypePromotionScope] objects tracking the
-/// component's nesting structure.  Whenever a variable is read, the current
-/// [TypePromotionFact] and [TypePromotionScope] are recorded for later use.
-///
-/// During type inference, the [TypeInferrer] calls back into this class to ask
-/// whether each variable read is a promoted read.  This is determined by
-/// examining the [TypePromotionScope] and [TypePromotionFact] objects that were
-/// recorded at the time the variable read was parsed, as well as other state
-/// that may have been updated later during the parsing process.
-///
-/// This class abstracts away the representation of the underlying AST using
-/// generic parameters.  Derived classes should set E and V to the class they
-/// use to represent expressions and variable declarations, respectively.
-abstract class TypePromoter {
-  TypePromoter.private();
-
-  factory TypePromoter(TypeSchemaEnvironment typeSchemaEnvironment) =
-      ShadowTypePromoter.private;
-
-  factory TypePromoter.disabled() = TypePromoterDisabled.private;
-
-  /// Returns the current type promotion scope.
-  TypePromotionScope get currentScope;
-
-  /// Computes the promoted type of a variable read having the given [fact] and
-  /// [scope].  Returns `null` if there is no promotion.
-  ///
-  /// [mutatedInClosure] indicates whether the variable was mutated in a closure
-  /// somewhere in the method.
-  DartType computePromotedType(
-      TypePromotionFact fact, TypePromotionScope scope, bool mutatedInClosure);
-
-  /// Updates the state to reflect the fact that we are entering an "else"
-  /// branch.
-  void enterElse();
-
-  /// Updates the state to reflect the fact that the LHS of an "&&" or "||"
-  /// expression has just been parsed, and we are entering the RHS.
-  void enterLogicalExpression(Expression lhs, String operator);
-
-  /// Updates the state to reflect the fact that the "condition" part of an "if"
-  /// statement or conditional expression has just been parsed, and we are
-  /// entering the "then" branch.
-  void enterThen(Expression condition);
-
-  /// Updates the state to reflect the fact that we have exited the "else"
-  /// branch of an "if" statement or conditional expression.
-  void exitConditional();
-
-  /// Updates the state to reflect the fact that we have exited the RHS of an
-  /// "&&" or "||" expression.
-  void exitLogicalExpression(Expression rhs, Expression logicalExpression);
-
-  /// Verifies that enter/exit calls were properly nested.
-  void finished();
-
-  /// Records that the given [variable] was accessed for reading, and returns a
-  /// [TypePromotionFact] describing the variable's current type promotion
-  /// state.
-  ///
-  /// [functionNestingLevel] should be the current nesting level of closures.
-  /// This is used to determine if the variable was accessed in a closure.
-  TypePromotionFact getFactForAccess(
-      VariableDeclaration variable, int functionNestingLevel);
-
-  /// Updates the state to reflect the fact that an "is" check of a local
-  /// variable was just parsed.
-  void handleIsCheck(Expression isExpression, bool isInverted,
-      VariableDeclaration variable, DartType type, int functionNestingLevel);
-
-  /// Updates the state to reflect the fact that the given [variable] was
-  /// mutated.
-  void mutateVariable(VariableDeclaration variable, int functionNestingLevel);
-}
-
-/// Implementation of [TypePromoter] which doesn't do any type promotion.
-///
-/// This is intended for profiling, to ensure that type inference and type
-/// promotion do not slow down compilation too much.
-class TypePromoterDisabled extends TypePromoter {
-  TypePromoterDisabled.private() : super.private();
-
-  @override
-  TypePromotionScope get currentScope => null;
-
-  @override
-  DartType computePromotedType(TypePromotionFact fact, TypePromotionScope scope,
-          bool mutatedInClosure) =>
-      null;
-
-  @override
-  void enterElse() {}
-
-  @override
-  void enterLogicalExpression(Expression lhs, String operator) {}
-
-  @override
-  void enterThen(Expression condition) {}
-
-  @override
-  void exitConditional() {}
-
-  @override
-  void exitLogicalExpression(Expression rhs, Expression logicalExpression) {}
-
-  @override
-  void finished() {}
-
-  @override
-  TypePromotionFact getFactForAccess(
-          VariableDeclaration variable, int functionNestingLevel) =>
-      null;
-
-  @override
-  void handleIsCheck(Expression isExpression, bool isInverted,
-      VariableDeclaration variable, DartType type, int functionNestingLevel) {}
-
-  @override
-  void mutateVariable(VariableDeclaration variable, int functionNestingLevel) {}
-}
-
-/// Derived class containing generic implementations of [TypePromoter].
-///
-/// This class contains as much of the implementation of type promotion as
-/// possible without needing access to private members of shadow objects.  It
-/// defers to abstract methods for everything else.
-abstract class TypePromoterImpl extends TypePromoter {
-  final TypeSchemaEnvironment typeSchemaEnvironment;
-
-  /// [TypePromotionFact] representing the initial state (no facts have been
-  /// determined yet).
-  ///
-  /// All linked lists of facts terminate in this object.
-  final _NullFact _nullFacts;
-
-  /// Map from variable declaration to the most recent [TypePromotionFact]
-  /// associated with the variable.
-  ///
-  /// [TypePromotionFact]s that are not associated with any variable show up in
-  /// this map under the key `null`.
-  final _factCache = <VariableDeclaration, TypePromotionFact>{};
-
-  /// Linked list of [TypePromotionFact]s that was current at the time the
-  /// [_factCache] was last updated.
-  TypePromotionFact _factCacheState;
-
-  /// Linked list of [TypePromotionFact]s describing what is known to be true
-  /// after execution of the expression or statement that was most recently
-  /// parsed.
-  TypePromotionFact _currentFacts;
-
-  /// The most recently parsed expression whose outcome potentially affects what
-  /// is known to be true (e.g. an "is" check or a logical expression).  May be
-  /// `null` if no such expression has been encountered yet.
-  Expression _promotionExpression;
-
-  /// Linked list of [TypePromotionFact]s describing what is known to be true
-  /// after execution of [_promotionExpression], assuming that
-  /// [_promotionExpression] evaluates to `true`.
-  TypePromotionFact _trueFactsForPromotionExpression;
-
-  /// Linked list of [TypePromotionScope]s describing the nesting structure that
-  /// contains the expression or statement that was most recently parsed.
-  TypePromotionScope _currentScope = const _TopLevelScope();
-
-  /// The sequence number of the [TypePromotionFact] that was most recently
-  /// created.
-  int _lastFactSequenceNumber = 0;
-
-  /// Map from variables to the set of scopes in which the variable is mutated.
-  /// If a variable is missing from the map, it is not mutated anywhere.
-  Map<VariableDeclaration, Set<TypePromotionScope>> _variableMutationScopes =
-      new Map<VariableDeclaration, Set<TypePromotionScope>>.identity();
-
-  TypePromoterImpl.private(TypeSchemaEnvironment typeSchemaEnvironment)
-      : this._(typeSchemaEnvironment, new _NullFact());
-
-  TypePromoterImpl._(this.typeSchemaEnvironment, _NullFact this._nullFacts)
-      : _factCacheState = _nullFacts,
-        _currentFacts = _nullFacts,
-        super.private() {
-    _factCache[null] = _nullFacts;
-  }
-
-  @override
-  TypePromotionScope get currentScope => _currentScope;
-
-  @override
-  DartType computePromotedType(
-      TypePromotionFact fact, TypePromotionScope scope, bool mutatedInClosure) {
-    if (mutatedInClosure) return null;
-    return fact?._computePromotedType(
-        this, scope, _variableMutationScopes[fact.variable]);
-  }
-
-  /// For internal debugging use, optionally prints the current state followed
-  /// by the event name.  Uncomment the call to [_printEvent] to see the
-  /// sequence of calls into the type promoter and the corresponding states.
-  void debugEvent(String name) {
-    // _printEvent(name);
-  }
-
-  @override
-  void enterElse() {
-    debugEvent('enterElse');
-    // Pop the scope and restore the facts to the state they were in before we
-    // entered the conditional.  No promotion happens in the "else" branch.
-    _ConditionalScope scope = _currentScope;
-    _currentScope = _currentScope._enclosing;
-    _currentFacts = scope.beforeElse;
-  }
-
-  @override
-  void enterLogicalExpression(Expression lhs, String operator) {
-    debugEvent('enterLogicalExpression');
-    if (!identical(operator, '&&')) {
-      // We don't promote for `||`.
-      _currentScope = new _LogicalScope(_currentScope, false, _currentFacts);
-    } else {
-      // Figure out what the facts are based on possible LHS outcomes.
-      TypePromotionFact trueFacts = _factsWhenTrue(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.
-      _currentScope = new _LogicalScope(_currentScope, true, _currentFacts);
-      // While processing the RHS, assume the condition was true.
-      _currentFacts = _addBlockingScopeToFacts(trueFacts);
-    }
-  }
-
-  @override
-  void enterThen(Expression condition) {
-    debugEvent('enterThen');
-    // Figure out what the facts are based on possible condition outcomes.
-    TypePromotionFact trueFacts = _factsWhenTrue(condition);
-    // Record the fact that we are entering a new scope, and save the current
-    // facts for when we enter the "else" branch.
-    _currentScope = new _ConditionalScope(_currentScope, _currentFacts);
-    // While processing the "then" block, assume the condition was true.
-    _currentFacts = _addBlockingScopeToFacts(trueFacts);
-  }
-
-  @override
-  void exitConditional() {
-    debugEvent('exitConditional');
-  }
-
-  @override
-  void exitLogicalExpression(Expression rhs, Expression logicalExpression) {
-    debugEvent('exitLogicalExpression');
-    _LogicalScope scope = _currentScope;
-    if (scope.isAnd) {
-      TypePromotionFact factsWhenTrue = _factsWhenTrue(rhs);
-      _currentFacts = scope.shortcutFacts;
-      _recordPromotionExpression(
-          logicalExpression, _addBlockingScopeToFacts(factsWhenTrue));
-    }
-    _currentScope = _currentScope._enclosing;
-  }
-
-  @override
-  void finished() {
-    debugEvent('finished');
-    if (_currentScope is! _TopLevelScope) {
-      internalProblem(
-          templateInternalProblemStackNotEmpty.withArguments(
-              "$runtimeType", "$_currentScope"),
-          -1,
-          null);
-    }
-  }
-
-  @override
-  TypePromotionFact getFactForAccess(
-      VariableDeclaration variable, int functionNestingLevel) {
-    debugEvent('getFactForAccess');
-    TypePromotionFact fact = _computeCurrentFactMap()[variable];
-    TypePromotionFact._recordAccessedInScope(
-        fact, _currentScope, functionNestingLevel);
-    return fact;
-  }
-
-  /// Returns the nesting level that was in effect when [variable] was declared.
-  int getVariableFunctionNestingLevel(VariableDeclaration variable);
-
-  @override
-  void handleIsCheck(Expression isExpression, bool isInverted,
-      VariableDeclaration variable, DartType type, int functionNestingLevel) {
-    debugEvent('handleIsCheck');
-    if (!isPromotionCandidate(variable)) return;
-    _IsCheck isCheck = new _IsCheck(
-        ++_lastFactSequenceNumber,
-        variable,
-        _currentFacts,
-        _computeCurrentFactMap()[variable],
-        functionNestingLevel,
-        type, []);
-    if (!isInverted) {
-      _recordPromotionExpression(isExpression, isCheck);
-    }
-  }
-
-  /// Determines whether the given variable should be considered for promotion
-  /// at all.
-  ///
-  /// This is needed because in kernel, [VariableDeclaration] objects are
-  /// sometimes used to represent local functions, which are not subject to
-  /// promotion.
-  bool isPromotionCandidate(VariableDeclaration variable);
-
-  /// Updates the state to reflect the fact that the given [variable] was
-  /// mutated.
-  void mutateVariable(VariableDeclaration variable, int functionNestingLevel) {
-    debugEvent('mutateVariable');
-    (_variableMutationScopes[variable] ??=
-            new Set<TypePromotionScope>.identity())
-        .add(_currentScope);
-    if (getVariableFunctionNestingLevel(variable) < functionNestingLevel) {
-      setVariableMutatedInClosure(variable);
-    }
-  }
-
-  /// Determines whether [a] and [b] represent the same expression, after
-  /// dropping redundant enclosing parentheses.
-  bool sameExpressions(Expression a, Expression b);
-
-  /// Records that the given variable was mutated inside a closure.
-  void setVariableMutatedInClosure(VariableDeclaration variable);
-
-  /// Updates any facts that are present in [facts] but not in [_currentFacts]
-  /// so that they include [_currentScope] in their list of blocking scopes, and
-  /// returns the resulting new linked list of facts.
-  ///
-  /// This is used when entering the body of a conditional, or the RHS of a
-  /// logical "and", to ensure that promotions are blocked if the construct
-  /// being entered contains any modifications of the corresponding variables.
-  /// It is also used when leaving the RHS of a logical "and", to ensure that
-  /// any promotions induced by the RHS of the "and" are blocked if the RHS of
-  /// the "and" contains any modifications of the corresponding variables.
-  TypePromotionFact _addBlockingScopeToFacts(TypePromotionFact facts) {
-    List<TypePromotionFact> factsToUpdate = [];
-    while (facts != _currentFacts) {
-      factsToUpdate.add(facts);
-      facts = facts.previous;
-    }
-    Map<VariableDeclaration, TypePromotionFact> factMap =
-        _computeCurrentFactMap();
-    for (TypePromotionFact fact in factsToUpdate.reversed) {
-      _IsCheck isCheck = fact as _IsCheck;
-      VariableDeclaration variable = isCheck.variable;
-      facts = new _IsCheck(
-          ++_lastFactSequenceNumber,
-          variable,
-          facts,
-          factMap[variable],
-          isCheck.functionNestingLevel,
-          isCheck.checkedType,
-          [...isCheck._blockingScopes, _currentScope]);
-      factMap[variable] = facts;
-      _factCacheState = facts;
-    }
-    return facts;
-  }
-
-  /// Returns a map from variable declaration to the most recent
-  /// [TypePromotionFact] associated with the variable.
-  Map<VariableDeclaration, TypePromotionFact> _computeCurrentFactMap() {
-    // Roll back any map entries associated with facts that are no longer in
-    // effect, and set [commonAncestor] to the fact that is an ancestor of
-    // the current state and the previously cached state.  To do this, we set a
-    // variable pointing to [_currentFacts], and then walk both it and
-    // [_factCacheState] back to their common ancestor, updating [_factCache] as
-    // we go.
-    TypePromotionFact commonAncestor = _currentFacts;
-    while (commonAncestor.sequenceNumber != _factCacheState.sequenceNumber) {
-      if (commonAncestor.sequenceNumber > _factCacheState.sequenceNumber) {
-        // The currently cached state is older than the common ancestor guess,
-        // so the common ancestor guess needs to be walked back.
-        commonAncestor = commonAncestor.previous;
-      } else {
-        // The common ancestor guess is older than the currently cached state,
-        // so we need to roll back the map entry associated with the currently
-        // cached state.
-        _factCache[_factCacheState.variable] =
-            _factCacheState.previousForVariable;
-        _factCacheState = _factCacheState.previous;
-      }
-    }
-    assert(identical(commonAncestor, _factCacheState));
-    // Roll forward any map entries associated with facts that are newly in
-    // effect.  Since newer facts link to older ones, it is easiest to do roll
-    // forward the most recent facts first.
-    for (TypePromotionFact newState = _currentFacts;
-        !identical(newState, commonAncestor);
-        newState = newState.previous) {
-      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 ||
-          newState.sequenceNumber > currentlyCached.sequenceNumber) {
-        _factCache[newState.variable] = newState;
-      }
-    }
-    _factCacheState = _currentFacts;
-    return _factCache;
-  }
-
-  /// Returns the set of facts known to be true after the execution of [e]
-  /// assuming it evaluates to `true`.
-  ///
-  /// [e] must be the most recently parsed expression or statement.
-  TypePromotionFact _factsWhenTrue(Expression e) =>
-      sameExpressions(_promotionExpression, e)
-          ? _trueFactsForPromotionExpression
-          : _currentFacts;
-
-  /// For internal debugging use, prints the current state followed by the event
-  /// name.
-  // ignore: unused_element
-  void _printEvent(String name) {
-    Iterable<TypePromotionFact> factChain(TypePromotionFact fact) sync* {
-      while (fact != null) {
-        yield fact;
-        fact = fact.previousForVariable;
-      }
-    }
-
-    _computeCurrentFactMap().forEach((variable, fact) {
-      if (fact == null) return;
-      print('  ${variable ?? '(null)'}: ${factChain(fact).join(' -> ')}');
-    });
-    if (_promotionExpression != null) {
-      print('  _promotionExpression: $_promotionExpression');
-      if (!identical(_trueFactsForPromotionExpression, _currentFacts)) {
-        print('    if true: '
-            '${factChain(_trueFactsForPromotionExpression).join(' -> ')}');
-      }
-    }
-    print(name);
-  }
-
-  /// Records that after the evaluation of [expression], the facts will be
-  /// [ifTrue] on a branch where the expression evaluated to `true`.
-  void _recordPromotionExpression(
-      Expression expression, TypePromotionFact ifTrue) {
-    _promotionExpression = expression;
-    _trueFactsForPromotionExpression = ifTrue;
-  }
-}
-
-/// A single fact which is known to the type promotion engine about the state of
-/// a variable (or about the flow control of the component).
-///
-/// The type argument V represents is the class which represents local variable
-/// declarations.
-///
-/// Facts are linked together into linked lists via the [previous] pointer into
-/// a data structure called a "fact chain" (or sometimes a "fact state"), which
-/// represents all facts that are known to hold at a certain point in the
-/// component.
-///
-/// The fact is said to "apply" to a given point in the execution of the
-/// component if the fact is part of the current fact state at the point the
-/// parser reaches that point in the component.
-///
-/// Note: just because a fact "applies" to a given point in the execution of
-/// the component doesn't mean a type will be promoted--it simply means that
-/// the fact was deduced at a previous point in the straight line execution of
-/// the code.  It's possible that the fact will be overshadowed by a later
-/// fact, or its effect will be cancelled by a later assignment.  The final
-/// determination of whether promotion occurs is left to [_computePromotedType].
-abstract class TypePromotionFact {
-  /// The variable this fact records information about, or `null` if this fact
-  /// records information about general flow control.
-  final VariableDeclaration variable;
-
-  /// The fact chain that was in effect prior to execution of the statement or
-  /// expression that caused this fact to be true.
-  final TypePromotionFact previous;
-
-  /// Integer associated with this fact.  Each time a fact is created it is
-  /// given a sequence number one greater than the previously generated fact.
-  /// This simplifies the algorithm for finding the common ancestor of two
-  /// facts; we repeatedly walk backward the fact with the larger sequence
-  /// number until the sequence numbers are the same.
-  final int sequenceNumber;
-
-  /// The most recent fact appearing in the fact chain [previous] whose
-  /// [variable] matches this one, or `null` if there is no such fact.
-  final TypePromotionFact previousForVariable;
-
-  /// The function nesting level of the expression that led to this fact.
-  final int functionNestingLevel;
-
-  /// Indicates whether this fact's variable was accessed inside a closure
-  /// within the scope the fact applies to.
-  bool _accessedInClosureInScope = false;
-
-  TypePromotionFact(this.sequenceNumber, this.variable, this.previous,
-      this.previousForVariable, this.functionNestingLevel);
-
-  /// Computes the promoted type for [variable] at a location in the code where
-  /// this fact applies.
-  ///
-  /// [scope] is the scope containing the read that might be promoted, and
-  /// [mutationScopes] is the set of scopes in which the variable is mutated, or
-  /// `null` if the variable isn't mutated anywhere.
-  ///
-  /// Should not be called until after parsing of the entire method is complete.
-  DartType _computePromotedType(TypePromoterImpl promoter,
-      TypePromotionScope scope, Iterable<TypePromotionScope> mutationScopes);
-
-  /// Records the fact that the variable referenced by [fact] was accessed
-  /// within the given scope, at the given function nesting level.
-  ///
-  /// If `null` is passed in for [fact], there is no effect.
-  static void _recordAccessedInScope(TypePromotionFact fact,
-      TypePromotionScope scope, int functionNestingLevel) {
-    // TODO(paulberry): make some integration test cases that exercise the
-    // behaviors of this function.  In particular verify that it's correct to
-    // test functionNestingLevel against fact.functionNestingLevel (as opposed
-    // to testing it against getVariableFunctionNestingLevel(variable)).
-    while (fact != null) {
-      if (functionNestingLevel > fact.functionNestingLevel) {
-        if (fact._accessedInClosureInScope) {
-          // The variable has already been accessed in a closure in the scope of
-          // the current promotion (and this, any enclosing promotions), so
-          // no further information needs to be updated.
-          return;
-        }
-        fact._accessedInClosureInScope = true;
-      }
-      fact = fact.previousForVariable;
-    }
-  }
-}
-
-/// Represents a contiguous block of program text in which variables may or may
-/// not be promoted.  Also used as a stack to keep track of state while the
-/// method is being parsed.
-class TypePromotionScope {
-  /// The nesting depth of this scope.  The outermost scope (representing the
-  /// whole method body) has a depth of 0.
-  final int _depth;
-
-  /// The [TypePromotionScope] representing the scope enclosing this one.
-  final TypePromotionScope _enclosing;
-
-  TypePromotionScope(this._enclosing) : _depth = _enclosing._depth + 1;
-
-  const TypePromotionScope._topLevel()
-      : _enclosing = null,
-        _depth = 0;
-
-  /// Determines whether this scope completely encloses (or is the same as)
-  /// [other].
-  bool containsScope(TypePromotionScope other) {
-    if (this._depth > other._depth) {
-      // We can't possibly contain a scope if we are at greater nesting depth
-      // than it is.
-      return false;
-    }
-    while (this._depth < other._depth) {
-      other = other._enclosing;
-    }
-    return identical(this, other);
-  }
-}
-
-/// [TypePromotionScope] representing the "then" and "else" bodies of an "if"
-/// statement or conditional expression.
-class _ConditionalScope extends TypePromotionScope {
-  /// The fact state in effect at the top of the "else" block.
-  final TypePromotionFact beforeElse;
-
-  _ConditionalScope(TypePromotionScope enclosing, this.beforeElse)
-      : super(enclosing);
-}
-
-/// [TypePromotionFact] representing an "is" check which succeeded.
-class _IsCheck extends TypePromotionFact {
-  /// The type appearing on the right hand side of "is".
-  final DartType checkedType;
-
-  /// List of the scopes in which a mutation to the variable would block
-  /// promotion.
-  final List<TypePromotionScope> _blockingScopes;
-
-  _IsCheck(
-      int sequenceNumber,
-      VariableDeclaration variable,
-      TypePromotionFact previous,
-      TypePromotionFact previousForVariable,
-      int functionNestingLevel,
-      this.checkedType,
-      this._blockingScopes)
-      : super(sequenceNumber, variable, previous, previousForVariable,
-            functionNestingLevel);
-
-  @override
-  String toString() => 'isCheck($checkedType)';
-
-  @override
-  DartType _computePromotedType(TypePromoterImpl promoter,
-      TypePromotionScope scope, Iterable<TypePromotionScope> mutationScopes) {
-    DartType previousPromotedType = previousForVariable?._computePromotedType(
-        promoter, scope, mutationScopes);
-
-    if (mutationScopes != null) {
-      // If the variable was mutated somewhere in a that blocks the promotion,
-      // promotion does not occur.
-      for (TypePromotionScope blockingScope in _blockingScopes) {
-        for (TypePromotionScope mutationScope in mutationScopes) {
-          if (blockingScope.containsScope(mutationScope)) {
-            return previousPromotedType;
-          }
-        }
-      }
-
-      // If the variable was mutated anywhere, and it was accessed inside a
-      // closure somewhere in the scope of the potential promotion, promotion
-      // does not occur.
-      if (_accessedInClosureInScope) {
-        return previousPromotedType;
-      }
-    }
-
-    // What we do now depends on the relationship between the previous type of
-    // the variable and the type we are checking against.
-    DartType previousType = previousPromotedType ?? variable.type;
-    if (promoter.typeSchemaEnvironment.isSubtypeOf(
-        checkedType, previousType, SubtypeCheckMode.withNullabilities)) {
-      // The type we are checking against is a subtype of the previous type of
-      // the variable, so this is a refinement; we can promote.
-      return checkedType;
-    } else if (previousType is TypeParameterType &&
-        promoter.typeSchemaEnvironment.isSubtypeOf(checkedType,
-            previousType.bound, SubtypeCheckMode.withNullabilities)) {
-      // The type we are checking against is a subtype of the bound of the
-      // previous type of the variable; we can promote the bound.
-      return new TypeParameterType.intersection(
-          previousType.parameter, previousType.nullability, checkedType);
-    } else {
-      // The types aren't sufficiently related; we can't promote.
-      return previousPromotedType;
-    }
-  }
-}
-
-/// [TypePromotionScope] representing the RHS of a logical expression.
-class _LogicalScope extends TypePromotionScope {
-  /// Indicates whether the logical operation is an `&&` or an `||`.
-  final bool isAnd;
-
-  /// The fact state in effect if the logical expression gets short-cut.
-  final TypePromotionFact shortcutFacts;
-
-  _LogicalScope(TypePromotionScope enclosing, this.isAnd, this.shortcutFacts)
-      : super(enclosing);
-}
-
-/// Instance of [TypePromotionFact] representing the facts which are known on
-/// entry to the method (i.e. nothing).
-class _NullFact extends TypePromotionFact {
-  _NullFact() : super(0, null, null, null, 0);
-
-  @override
-  String toString() => 'null';
-
-  @override
-  DartType _computePromotedType(TypePromoter promoter, TypePromotionScope scope,
-      Iterable<TypePromotionScope> mutationScopes) {
-    throw new StateError('Tried to create promoted type for no variable');
-  }
-}
-
-/// Instance of [TypePromotionScope] representing the entire method body.
-class _TopLevelScope extends TypePromotionScope {
-  const _TopLevelScope() : super._topLevel();
-}
diff --git a/pkg/front_end/test/fasta/expression_suite.dart b/pkg/front_end/test/fasta/expression_suite.dart
index ddf7d48..4178a6f 100644
--- a/pkg/front_end/test/fasta/expression_suite.dart
+++ b/pkg/front_end/test/fasta/expression_suite.dart
@@ -313,7 +313,8 @@
     }
     List<TypeParameter> typeParams = [];
     for (String name in test.typeDefinitions) {
-      typeParams.add(new TypeParameter(name, new DynamicType()));
+      typeParams
+          .add(new TypeParameter(name, new DynamicType(), new DynamicType()));
     }
 
     Procedure compiledProcedure = await compiler.compileExpression(
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index 8d54c8a..6b31ffd 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -71,7 +71,7 @@
 }
 class bool extends self::Object {
 }
-class DefaultTypes<S extends self::Object? = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S%> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (Never) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
+class DefaultTypes<S extends self::Object? = dynamic, T extends self::Object, U extends self::List<self::DefaultTypes::S%> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (Never) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
 }
 class Super extends self::Object implements self::Comparable<self::Sub> {
 }
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index b51b99d..543a79f 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -511,15 +511,12 @@
 
 void _testVariableGetImpl() {
   VariableDeclaration variable = new VariableDeclaration('foo');
-  testExpression(
-      new VariableGetImpl(variable, null, null, forNullGuardedAccess: false),
-      '''
+  testExpression(new VariableGetImpl(variable, forNullGuardedAccess: false), '''
+foo''');
+  testExpression(new VariableGetImpl(variable, forNullGuardedAccess: true), '''
 foo''');
   testExpression(
-      new VariableGetImpl(variable, null, null, forNullGuardedAccess: true), '''
-foo''');
-  testExpression(
-      new VariableGetImpl(variable, null, null, forNullGuardedAccess: false)
+      new VariableGetImpl(variable, forNullGuardedAccess: false)
         ..promotedType = const VoidType(),
       '''
 foo{void}''');
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart
new file mode 100644
index 0000000..ea57240
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+extension E on A? {
+  void foo() {}
+}
+
+bar(E e) => e.foo();
+
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.strong.expect b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.strong.expect
new file mode 100644
index 0000000..3074033
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.strong.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension E on self::A? {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static method E|foo(lowered final self::A? #this) → void {}
+static method E|get#foo(lowered final self::A? #this) → () → void
+  return () → void => self::E|foo(#this);
+static method bar(self::E e) → dynamic
+  return self::E|foo(e);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.textual_outline.expect
new file mode 100644
index 0000000..37161fe
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+class A {}
+
+extension E on A? {
+  void foo() {}
+}
+
+bar(E e) => e.foo();
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a6cd4d8
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+bar(E e) => e.foo();
+
+class A {}
+
+extension E on A? {
+  void foo() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.expect b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.expect
new file mode 100644
index 0000000..3074033
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension E on self::A? {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static method E|foo(lowered final self::A? #this) → void {}
+static method E|get#foo(lowered final self::A? #this) → () → void
+  return () → void => self::E|foo(#this);
+static method bar(self::E e) → dynamic
+  return self::E|foo(e);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.outline.expect
new file mode 100644
index 0000000..c897d7f
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+extension E on self::A? {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static method E|foo(lowered final self::A? #this) → void
+  ;
+static method E|get#foo(lowered final self::A? #this) → () → void
+  return () → void => self::E|foo(#this);
+static method bar(self::E e) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart b/pkg/front_end/testcases/extension_types/issue45775.dart
new file mode 100644
index 0000000..012fff6
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Foo {}
+
+extension Bar on Foo {}
+
+void main() {
+  Bar bar = Foo();
+}
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart.strong.expect b/pkg/front_end/testcases/extension_types/issue45775.dart.strong.expect
new file mode 100644
index 0000000..f5b3d09
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue45775.dart:10:13: Error: A value of type 'Foo' can't be assigned to a variable of type 'Bar'.
+//  - 'Foo' is from 'pkg/front_end/testcases/extension_types/issue45775.dart'.
+//   Bar bar = Foo();
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+extension Bar on self::Foo {
+}
+static method main() → void {
+  self::Bar bar = let final Never #t1 = invalid-expression "pkg/front_end/testcases/extension_types/issue45775.dart:10:13: Error: A value of type 'Foo' can't be assigned to a variable of type 'Bar'.
+ - 'Foo' is from 'pkg/front_end/testcases/extension_types/issue45775.dart'.
+  Bar bar = Foo();
+            ^" in new self::Foo::•() as{TypeError,ForNonNullableByDefault} self::Bar;
+}
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart.textual_outline.expect b/pkg/front_end/testcases/extension_types/issue45775.dart.textual_outline.expect
new file mode 100644
index 0000000..a30a73d
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+class Foo {}
+
+extension Bar on Foo {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extension_types/issue45775.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a30a73d
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class Foo {}
+
+extension Bar on Foo {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart.weak.expect b/pkg/front_end/testcases/extension_types/issue45775.dart.weak.expect
new file mode 100644
index 0000000..f5b3d09
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/issue45775.dart:10:13: Error: A value of type 'Foo' can't be assigned to a variable of type 'Bar'.
+//  - 'Foo' is from 'pkg/front_end/testcases/extension_types/issue45775.dart'.
+//   Bar bar = Foo();
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+extension Bar on self::Foo {
+}
+static method main() → void {
+  self::Bar bar = let final Never #t1 = invalid-expression "pkg/front_end/testcases/extension_types/issue45775.dart:10:13: Error: A value of type 'Foo' can't be assigned to a variable of type 'Bar'.
+ - 'Foo' is from 'pkg/front_end/testcases/extension_types/issue45775.dart'.
+  Bar bar = Foo();
+            ^" in new self::Foo::•() as{TypeError,ForNonNullableByDefault} self::Bar;
+}
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart.weak.outline.expect b/pkg/front_end/testcases/extension_types/issue45775.dart.weak.outline.expect
new file mode 100644
index 0000000..621635e
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart.weak.outline.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    ;
+}
+extension Bar on self::Foo {
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.expect
index b7ca556..8c13b5c 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object* = core::Object*> on T* {
+extension Extension1<T extends core::Object*> on T* {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String* = core::String*> on T* {
+extension Extension2<T extends core::String*> on T* {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic = dynamic> on T* {
+extension Extension3<T extends dynamic> on T* {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -42,51 +42,51 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object* = core::Object*, S extends core::Object* = core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object* = core::Object*, S extends core::String* = core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object* = core::Object*, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object* = core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
+static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
+static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
+static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String* = core::String*, S extends core::Object* = core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String* = core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String* = core::String*, S extends core::String* = core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String* = core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String* = core::String*, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String* = core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String* = core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
-static method Extension2|get#method4<T extends core::String* = core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
+static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
+static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
+static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
+static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object* = core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String* = core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object* = core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String* = core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
+static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
+static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
+static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
 static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic {}
 static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect
index 460599a..923a293 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object* = core::Object*> on T* {
+extension Extension1<T extends core::Object*> on T* {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String* = core::String*> on T* {
+extension Extension2<T extends core::String*> on T* {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic = dynamic> on T* {
+extension Extension3<T extends dynamic> on T* {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -42,66 +42,66 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object* = core::Object*, S extends core::Object* = core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic
+static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic
   ;
-static method Extension1|get#method1<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object* = core::Object*, S extends core::String* = core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic
+static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
+static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic
   ;
-static method Extension1|get#method2<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object* = core::Object*, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic
+static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
+static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic
   ;
-static method Extension1|get#method3<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object* = core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic
+static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
+static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic
   ;
-static method Extension1|get#method4<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String* = core::String*, S extends core::Object* = core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic
+static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic
   ;
-static method Extension2|get#method1<T extends core::String* = core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String* = core::String*, S extends core::String* = core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic
+static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
+static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic
   ;
-static method Extension2|get#method2<T extends core::String* = core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String* = core::String*, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic
+static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
+static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic
   ;
-static method Extension2|get#method3<T extends core::String* = core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String* = core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic
+static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
+static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic
   ;
-static method Extension2|get#method4<T extends core::String* = core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object* = core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic
+static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic
   ;
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String* = core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic
   ;
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic
   ;
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic
   ;
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object* = core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic
+static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic
   ;
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String* = core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic
+static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
+static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic
   ;
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic
+static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
+static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic
   ;
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
+static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
 static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic
   ;
 static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect
index b7ca556..8c13b5c 100644
--- a/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object* = core::Object*> on T* {
+extension Extension1<T extends core::Object*> on T* {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -12,7 +12,7 @@
   method method4 = self::Extension1|method4;
   tearoff method4 = self::Extension1|get#method4;
 }
-extension Extension2<T extends core::String* = core::String*> on T* {
+extension Extension2<T extends core::String*> on T* {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -22,7 +22,7 @@
   method method4 = self::Extension2|method4;
   tearoff method4 = self::Extension2|get#method4;
 }
-extension Extension3<T extends dynamic = dynamic> on T* {
+extension Extension3<T extends dynamic> on T* {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -42,51 +42,51 @@
   method method4 = self::Extension4|method4;
   tearoff method4 = self::Extension4|get#method4;
 }
-static method Extension1|method1<T extends core::Object* = core::Object*, S extends core::Object* = core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
-static method Extension1|method2<T extends core::Object* = core::Object*, S extends core::String* = core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
-static method Extension1|method3<T extends core::Object* = core::Object*, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
-static method Extension1|method4<T extends core::Object* = core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object* = core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
+static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
+static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
+static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
-static method Extension2|method1<T extends core::String* = core::String*, S extends core::Object* = core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String* = core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
-static method Extension2|method2<T extends core::String* = core::String*, S extends core::String* = core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String* = core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
-static method Extension2|method3<T extends core::String* = core::String*, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String* = core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
-static method Extension2|method4<T extends core::String* = core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
-static method Extension2|get#method4<T extends core::String* = core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
+static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
+static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
+static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
+static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object* = core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String* = core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
-static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object* = core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object* = core::Object*>() →* dynamic
-  return <S extends core::Object* = core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
-static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String* = core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String* = core::String*>() →* dynamic
-  return <S extends core::String* = core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
-static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic = dynamic>() →* dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
+static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
+static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
+static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
 static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic {}
 static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
   return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect
index 635468b..cef7b3b 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.expect
@@ -827,7 +827,7 @@
     : super self::A::•()
     ;
 }
-class Class<T extends self::A* = self::A*> extends core::Object {
+class Class<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T*>*
     : super core::Object::•()
     ;
@@ -842,7 +842,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B* = self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B*> on self::Class<T*>* {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
@@ -885,12 +885,12 @@
 static final field dynamic field27 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
 static final field dynamic field28 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
 static final field dynamic field29 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static method Extension|method<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
-static method Extension|get#method<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
+static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
+static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
   return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B* = self::B*, S extends self::B* = self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
-static method Extension|get#genericMethod<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B* = self::B*>(S*) →* dynamic
-  return <S extends self::B* = self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
+static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
+  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
 static method main() → dynamic {}
 static method test() → dynamic {
   self::A* a;
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect
index b599220..22f598c 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.outline.expect
@@ -21,7 +21,7 @@
   synthetic constructor •() → self::B*
     ;
 }
-class Class<T extends self::A* = self::A*> extends core::Object {
+class Class<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -35,7 +35,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B* = self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B*> on self::Class<T*>* {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
@@ -73,14 +73,14 @@
 static final field dynamic field27;
 static final field dynamic field28;
 static final field dynamic field29;
-static method Extension|method<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic
+static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic
   ;
-static method Extension|get#method<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
+static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
   return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B* = self::B*, S extends self::B* = self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic
+static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic
   ;
-static method Extension|get#genericMethod<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B* = self::B*>(S*) →* dynamic
-  return <S extends self::B* = self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
+  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
 static method main() → dynamic
   ;
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect
index 635468b..cef7b3b 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.transformed.expect
@@ -827,7 +827,7 @@
     : super self::A::•()
     ;
 }
-class Class<T extends self::A* = self::A*> extends core::Object {
+class Class<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T*>*
     : super core::Object::•()
     ;
@@ -842,7 +842,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::B* = self::B*> on self::Class<T*>* {
+extension Extension<T extends self::B*> on self::Class<T*>* {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   method genericMethod = self::Extension|genericMethod;
@@ -885,12 +885,12 @@
 static final field dynamic field27 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
 static final field dynamic field28 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
 static final field dynamic field29 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
-static method Extension|method<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
-static method Extension|get#method<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
+static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
+static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
   return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|genericMethod<T extends self::B* = self::B*, S extends self::B* = self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
-static method Extension|get#genericMethod<T extends self::B* = self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B* = self::B*>(S*) →* dynamic
-  return <S extends self::B* = self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
+static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
+  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
 static method main() → dynamic {}
 static method test() → dynamic {
   self::A* a;
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect
index c216317..cf95acc 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.expect
@@ -44,10 +44,10 @@
   return #this.{self::Class::field1};
 static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
   return #this.{self::Class::field1}.{core::num::+}(t) as{TypeError} core::int*;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension2|get#field(lowered final self::Class* #this) → core::int*
   return #this.{self::Class::field2};
 static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void {
@@ -57,10 +57,10 @@
   return #this.{self::Class::field2};
 static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
   return #this.{self::Class::field2}.{core::num::+}(t) as{TypeError} core::int*;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method main() → dynamic {
   self::Class* c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
@@ -75,8 +75,8 @@
   self::expect(97, self::Extension2|genericMethod<core::int*>(c, 10));
   self::expect(52, self::Extension1|genericMethod<core::num*>(c, 10));
   self::expect(97, self::Extension2|genericMethod<core::num*>(c, 10));
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
+  <T extends core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
   self::expect(52, genericTearOff1.call<core::int*>(10));
   self::expect(97, genericTearOff2.call<core::int*>(10));
   self::expect(52, genericTearOff1.call<core::num*>(10));
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect
index c567e2c..a5c90f6 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.outline.expect
@@ -42,10 +42,10 @@
   ;
 static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
   ;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension2|get#field(lowered final self::Class* #this) → core::int*
   ;
 static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void
@@ -54,10 +54,10 @@
   ;
 static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
   ;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect
index e1fd4f1..ad97e80 100644
--- a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.transformed.expect
@@ -44,10 +44,10 @@
   return #this.{self::Class::field1};
 static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
   return #this.{self::Class::field1}.{core::num::+}(t) as{TypeError} core::int*;
-static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension2|get#field(lowered final self::Class* #this) → core::int*
   return #this.{self::Class::field2};
 static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void {
@@ -57,10 +57,10 @@
   return #this.{self::Class::field2};
 static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
   return #this.{self::Class::field2}.{core::num::+}(t) as{TypeError} core::int*;
-static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method main() → dynamic {
   self::Class* c = new self::Class::•();
   self::expect(42, self::Extension1|get#field(c));
@@ -75,8 +75,8 @@
   self::expect(97, self::Extension2|genericMethod<core::int*>(c, 10));
   self::expect(52, self::Extension1|genericMethod<core::num*>(c, 10));
   self::expect(97, self::Extension2|genericMethod<core::num*>(c, 10));
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
+  <T extends core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
   self::expect(52, genericTearOff1.call<core::int*>(10));
   self::expect(97, genericTearOff2.call<core::int*>(10));
   self::expect(52, genericTearOff1.call<core::num*>(10));
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect
index 1934541..6cff7c7 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num* = core::num*> extends core::Object {
+class Class<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::Class::T* field1;
   generic-covariant-impl field self::Class::T* field2;
   constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
@@ -19,7 +19,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num* = core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num*> on self::Class<T*>* {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -28,7 +28,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num* = core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num*> on self::Class<T*>* {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -37,39 +37,39 @@
   set field = self::Extension2|set#field;
 }
 static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
+static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
   self::Extension1|latestType = "${self::Extension1|get#field::T*}";
   return #this.{self::Class::field1};
 }
-static method Extension1|set#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
+static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
   self::Extension1|latestType = "${self::Extension1|set#field::T*}";
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
+static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
   self::Extension1|latestType = "${self::Extension1|method::T*}";
   return #this.{self::Class::field1};
 }
-static method Extension1|get#method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
+static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
   return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*, S extends core::num* = core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
+static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
   self::Extension1|latestType = "${self::Extension1|genericMethod::T*}:${self::Extension1|genericMethod::S*}";
   return #this.{self::Class::field1}.{core::num::+}(t) as{TypeError} self::Extension1|genericMethod::T*;
 }
-static method Extension1|get#genericMethod<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num* = core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num* = core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
+static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
   return #this.{self::Class::field2};
-static method Extension2|set#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
+static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
+static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
   return #this.{self::Class::field2};
-static method Extension2|get#method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
+static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
   return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*, S extends core::num* = core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
+static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
   return #this.{self::Class::field2}.{core::num::+}(t) as{TypeError} self::Extension2|genericMethod::T*;
-static method Extension2|get#genericMethod<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num* = core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num* = core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
 static method main() → dynamic {
   self::Class<core::int*>* c = new self::Class::•<core::int*>(42, 87);
   self::expect(42, self::Extension1|get#field<core::num*>(c));
@@ -106,9 +106,9 @@
   self::expect("int:num", self::Extension1|latestType);
   self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  <S extends core::num* = core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
-  <S extends core::num* = core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
-  <S extends core::num* = core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
+  <S extends core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
+  <S extends core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
+  <S extends core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
   self::expect(52, genericTearOffNumber1.call<core::int*>(10));
   self::expect("num:int", self::Extension1|latestType);
   self::expect(52, genericTearOffInteger1.call<core::int*>(10));
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect
index 633ea25..54e9504 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num* = core::num*> extends core::Object {
+class Class<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::Class::T* field1;
   generic-covariant-impl field self::Class::T* field2;
   constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num* = core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num*> on self::Class<T*>* {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -27,7 +27,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num* = core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num*> on self::Class<T*>* {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -36,30 +36,30 @@
   set field = self::Extension2|set#field;
 }
 static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T*
+static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T*
   ;
-static method Extension1|set#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void
+static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void
   ;
-static method Extension1|method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T*
+static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T*
   ;
-static method Extension1|get#method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
+static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
   return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*, S extends core::num* = core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T*
+static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T*
   ;
-static method Extension1|get#genericMethod<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num* = core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num* = core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
+static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
   ;
-static method Extension2|set#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void
+static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void
   ;
-static method Extension2|method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
+static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
   ;
-static method Extension2|get#method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
+static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
   return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*, S extends core::num* = core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
+static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
   ;
-static method Extension2|get#genericMethod<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num* = core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num* = core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect
index c99297a..8f41bf6 100644
--- a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Class<T extends core::num* = core::num*> extends core::Object {
+class Class<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::Class::T* field1;
   generic-covariant-impl field self::Class::T* field2;
   constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
@@ -19,7 +19,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension1<T extends core::num* = core::num*> on self::Class<T*>* {
+extension Extension1<T extends core::num*> on self::Class<T*>* {
   static field latestType = self::Extension1|latestType;
   get field = self::Extension1|get#field;
   method method = self::Extension1|method;
@@ -28,7 +28,7 @@
   tearoff genericMethod = self::Extension1|get#genericMethod;
   set field = self::Extension1|set#field;
 }
-extension Extension2<T extends core::num* = core::num*> on self::Class<T*>* {
+extension Extension2<T extends core::num*> on self::Class<T*>* {
   get field = self::Extension2|get#field;
   method method = self::Extension2|method;
   tearoff method = self::Extension2|get#method;
@@ -37,39 +37,39 @@
   set field = self::Extension2|set#field;
 }
 static field core::String* Extension1|latestType;
-static method Extension1|get#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
+static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
   self::Extension1|latestType = "${self::Extension1|get#field::T*}";
   return #this.{self::Class::field1};
 }
-static method Extension1|set#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
+static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
   self::Extension1|latestType = "${self::Extension1|set#field::T*}";
   #this.{self::Class::field1} = value;
 }
-static method Extension1|method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
+static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
   self::Extension1|latestType = "${self::Extension1|method::T*}";
   return #this.{self::Class::field1};
 }
-static method Extension1|get#method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
+static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
   return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*, S extends core::num* = core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
+static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
   self::Extension1|latestType = "${self::Extension1|genericMethod::T*}:${self::Extension1|genericMethod::S*}";
   return #this.{self::Class::field1}.{core::num::+}(t) as{TypeError} self::Extension1|genericMethod::T*;
 }
-static method Extension1|get#genericMethod<T extends core::num* = core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num* = core::num*>(S*) →* self::Extension1|get#genericMethod::T*
-  return <S extends core::num* = core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
-static method Extension2|get#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
+static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
   return #this.{self::Class::field2};
-static method Extension2|set#field<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
+static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
   #this.{self::Class::field2} = value;
 }
-static method Extension2|method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
+static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
   return #this.{self::Class::field2};
-static method Extension2|get#method<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
+static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
   return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*, S extends core::num* = core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
+static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
   return #this.{self::Class::field2}.{core::num::+}(t) as{TypeError} self::Extension2|genericMethod::T*;
-static method Extension2|get#genericMethod<T extends core::num* = core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num* = core::num*>(S*) →* self::Extension2|get#genericMethod::T*
-  return <S extends core::num* = core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
 static method main() → dynamic {
   self::Class<core::int*>* c = new self::Class::•<core::int*>(42, 87);
   self::expect(42, self::Extension1|get#field<core::num*>(c));
@@ -106,9 +106,9 @@
   self::expect("int:num", self::Extension1|latestType);
   self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
   self::expect("int:int", self::Extension1|latestType);
-  <S extends core::num* = core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
-  <S extends core::num* = core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
-  <S extends core::num* = core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
+  <S extends core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
+  <S extends core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
+  <S extends core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
   self::expect(52, genericTearOffNumber1.call<core::int*>(10));
   self::expect("num:int", self::Extension1|latestType);
   self::expect(52, genericTearOffInteger1.call<core::int*>(10));
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect
index 4fd4d22..acfd4c8 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.expect
@@ -58,12 +58,12 @@
 }
 static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
   core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension1|get#property(lowered final self::Class1* #this) → core::int* {
   core::print("Extension1.property get on ${#this}");
   return #this.{self::Class1::field};
@@ -79,12 +79,12 @@
 }
 static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
   core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(4) as{TypeError} core::int*;
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method Extension2|get#property(lowered final self::Class2* #this) → core::int* {
   core::print("Extension2.property get on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(5);
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect
index 36f5cf9..4e0c07a 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.outline.expect
@@ -54,10 +54,10 @@
   ;
 static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int*
   ;
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension1|get#property(lowered final self::Class1* #this) → core::int*
   ;
 static method Extension1|set#property(lowered final self::Class1* #this, core::int* value) → void
@@ -66,10 +66,10 @@
   ;
 static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int*
   ;
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method Extension2|get#property(lowered final self::Class2* #this) → core::int*
   ;
 static method Extension2|set#property(lowered final self::Class2* #this, core::int* value) → void
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect
index 9d2558b..c022d12 100644
--- a/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.transformed.expect
@@ -58,12 +58,12 @@
 }
 static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
   core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension1|get#property(lowered final self::Class1* #this) → core::int* {
   core::print("Extension1.property get on ${#this}");
   return #this.{self::Class1::field};
@@ -79,12 +79,12 @@
 }
 static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
   core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(4) as{TypeError} core::int*;
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method Extension2|get#property(lowered final self::Class2* #this) → core::int* {
   core::print("Extension2.property get on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(5);
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect
index 3e30930..7ff18f4 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.expect
@@ -54,24 +54,24 @@
 }
 static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
   core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension2|method(lowered final self::Class2* #this) → core::int* {
   core::print("Extension2.method on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(2);
 }
 static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
   core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(3) as{TypeError} core::int*;
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method main() → dynamic {
   self::testExtension1();
   self::testExtension2();
@@ -87,10 +87,10 @@
   self::expect(1, tearOff1.call());
   c1 = new self::Class1::•(7.{core::int::unary-}());
   self::expect(1, tearOff1.call());
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
+  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
   self::expect(38, genericTearOff0.call<core::int*>(42));
   self::expect(38, genericTearOff0.call<core::num*>(42));
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
   self::expect(35, genericTearOff1.call<core::int*>(42));
   self::expect(35, genericTearOff1.call<core::num*>(42));
 }
@@ -105,10 +105,10 @@
   self::expect(3, tearOff1.call());
   c1 = new self::Class2::•(7.{core::int::unary-}());
   self::expect(3, tearOff1.call());
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
+  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
   self::expect(41, genericTearOff0.call<core::int*>(42));
   self::expect(41, genericTearOff0.call<core::num*>(42));
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
   self::expect(38, genericTearOff1.call<core::int*>(42));
   self::expect(38, genericTearOff1.call<core::num*>(42));
 }
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect
index 03756cc..8d3c1e7 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.outline.expect
@@ -50,18 +50,18 @@
   ;
 static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int*
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int*
   ;
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension2|method(lowered final self::Class2* #this) → core::int*
   ;
 static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int*
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int*
   ;
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method main() → dynamic
   ;
 static method testExtension1() → dynamic
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect
index 70b8f9f..1c79b12 100644
--- a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.transformed.expect
@@ -54,24 +54,24 @@
 }
 static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::Extension1|method(#this);
-static method Extension1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
   core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
 }
-static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
 static method Extension2|method(lowered final self::Class2* #this) → core::int* {
   core::print("Extension2.method on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(2);
 }
 static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::Extension2|method(#this);
-static method Extension2|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
   core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(3) as{TypeError} core::int*;
 }
-static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
 static method main() → dynamic {
   self::testExtension1();
   self::testExtension2();
@@ -87,10 +87,10 @@
   self::expect(1, tearOff1.call());
   c1 = new self::Class1::•(7.{core::int::unary-}());
   self::expect(1, tearOff1.call());
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
+  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
   self::expect(38, genericTearOff0.call<core::int*>(42));
   self::expect(38, genericTearOff0.call<core::num*>(42));
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
   self::expect(35, genericTearOff1.call<core::int*>(42));
   self::expect(35, genericTearOff1.call<core::num*>(42));
 }
@@ -105,10 +105,10 @@
   self::expect(3, tearOff1.call());
   c1 = new self::Class2::•(7.{core::int::unary-}());
   self::expect(3, tearOff1.call());
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
+  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
   self::expect(41, genericTearOff0.call<core::int*>(42));
   self::expect(41, genericTearOff0.call<core::num*>(42));
-  <T extends core::num* = core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
   self::expect(38, genericTearOff1.call<core::int*>(42));
   self::expect(38, genericTearOff1.call<core::num*>(42));
 }
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect
index ada1a5c..b657553 100644
--- a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num* = core::num*> extends core::Object {
+class Foo<S extends core::num*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.outline.expect
index 44bd9dc..cf1db41 100644
--- a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num* = core::num*> extends core::Object {
+class Foo<S extends core::num*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S*>*
     ;
   method test1(generic-covariant-impl self::Foo::S* x) → void
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect
index ada1a5c..b657553 100644
--- a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num* = core::num*> extends core::Object {
+class Foo<S extends core::num*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect
index 9c1f826..7fd4a5b 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.expect
@@ -40,7 +40,7 @@
     return i;
   core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
   core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
-  function local2<S extends self::Subclass* = self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
+  function local2<S extends self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
     return a;
   core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
 }
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect
index 9c1f826..7fd4a5b 100644
--- a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.transformed.expect
@@ -40,7 +40,7 @@
     return i;
   core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
   core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
-  function local2<S extends self::Subclass* = self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
+  function local2<S extends self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
     return a;
   core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
 }
diff --git a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.expect b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.expect
index 75adac2..a5fc214 100644
--- a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension BestCom<T extends core::num* = core::num*> on core::Iterable<T*>* {
+extension BestCom<T extends core::num*> on core::Iterable<T*>* {
   method best = self::BestCom|best;
   tearoff best = self::BestCom|get#best;
 }
@@ -14,9 +14,9 @@
   method best = self::BestSpec|best;
   tearoff best = self::BestSpec|get#best;
 }
-static method BestCom|best<T extends core::num* = core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
+static method BestCom|best<T extends core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
   return null;
-static method BestCom|get#best<T extends core::num* = core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
+static method BestCom|get#best<T extends core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
   return () → self::BestCom|get#best::T* => self::BestCom|best<self::BestCom|get#best::T*>(#this);
 static method BestList|best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|best::T*>* #this) → self::BestList|best::T*
   return null;
diff --git a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.outline.expect
index f2746bb..e1ea935 100644
--- a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension BestCom<T extends core::num* = core::num*> on core::Iterable<T*>* {
+extension BestCom<T extends core::num*> on core::Iterable<T*>* {
   method best = self::BestCom|best;
   tearoff best = self::BestCom|get#best;
 }
@@ -14,9 +14,9 @@
   method best = self::BestSpec|best;
   tearoff best = self::BestSpec|get#best;
 }
-static method BestCom|best<T extends core::num* = core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
+static method BestCom|best<T extends core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
   ;
-static method BestCom|get#best<T extends core::num* = core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
+static method BestCom|get#best<T extends core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
   return () → self::BestCom|get#best::T* => self::BestCom|best<self::BestCom|get#best::T*>(#this);
 static method BestList|best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|best::T*>* #this) → self::BestList|best::T*
   ;
diff --git a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.transformed.expect
index 75adac2..a5fc214 100644
--- a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension BestCom<T extends core::num* = core::num*> on core::Iterable<T*>* {
+extension BestCom<T extends core::num*> on core::Iterable<T*>* {
   method best = self::BestCom|best;
   tearoff best = self::BestCom|get#best;
 }
@@ -14,9 +14,9 @@
   method best = self::BestSpec|best;
   tearoff best = self::BestSpec|get#best;
 }
-static method BestCom|best<T extends core::num* = core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
+static method BestCom|best<T extends core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
   return null;
-static method BestCom|get#best<T extends core::num* = core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
+static method BestCom|get#best<T extends core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
   return () → self::BestCom|get#best::T* => self::BestCom|best<self::BestCom|get#best::T*>(#this);
 static method BestList|best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|best::T*>* #this) → self::BestList|best::T*
   return null;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect
index 21907d2..4fa3d96 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.expect
@@ -81,19 +81,19 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::Struct* = self::Struct*> on T* {
+extension Extension<T extends self::Struct*> on T* {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   get property = self::Extension|get#property;
   set property = self::Extension|set#property;
 }
-static method Extension|method<T extends self::Struct* = self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
+static method Extension|method<T extends self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
   return #this;
-static method Extension|get#method<T extends self::Struct* = self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
+static method Extension|get#method<T extends self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
   return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|get#property<T extends self::Struct* = self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
+static method Extension|get#property<T extends self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
   return #this;
-static method Extension|set#property<T extends self::Struct* = self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
+static method Extension|set#property<T extends self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
 static method main() → dynamic {
   self::Struct* struct;
   self::StructA* structA;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.outline.expect
index 3dd1c35..4503bad 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.outline.expect
@@ -38,19 +38,19 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::Struct* = self::Struct*> on T* {
+extension Extension<T extends self::Struct*> on T* {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   get property = self::Extension|get#property;
   set property = self::Extension|set#property;
 }
-static method Extension|method<T extends self::Struct* = self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
+static method Extension|method<T extends self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
   ;
-static method Extension|get#method<T extends self::Struct* = self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
+static method Extension|get#method<T extends self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
   return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|get#property<T extends self::Struct* = self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
+static method Extension|get#property<T extends self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
   ;
-static method Extension|set#property<T extends self::Struct* = self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void
+static method Extension|set#property<T extends self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect
index 21907d2..4fa3d96 100644
--- a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.transformed.expect
@@ -81,19 +81,19 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends self::Struct* = self::Struct*> on T* {
+extension Extension<T extends self::Struct*> on T* {
   method method = self::Extension|method;
   tearoff method = self::Extension|get#method;
   get property = self::Extension|get#property;
   set property = self::Extension|set#property;
 }
-static method Extension|method<T extends self::Struct* = self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
+static method Extension|method<T extends self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
   return #this;
-static method Extension|get#method<T extends self::Struct* = self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
+static method Extension|get#method<T extends self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
   return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
-static method Extension|get#property<T extends self::Struct* = self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
+static method Extension|get#property<T extends self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
   return #this;
-static method Extension|set#property<T extends self::Struct* = self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
+static method Extension|set#property<T extends self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
 static method main() → dynamic {
   self::Struct* struct;
   self::StructA* structA;
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.expect
index a20912a..5b11e7e 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.expect
@@ -26,7 +26,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class* = self::Class*> on T* {
+extension BoundExtension<T extends self::Class*> on T* {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -34,9 +34,9 @@
   return #this;
 static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
   return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method BoundExtension|method2<T extends self::Class* = self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+static method BoundExtension|method2<T extends self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
   return #this;
-static method BoundExtension|get#method2<T extends self::Class* = self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+static method BoundExtension|get#method2<T extends self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
   return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
 static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class* {
   if(t1 is self::SubClass*) {
@@ -44,7 +44,7 @@
   }
   return new self::Class::•();
 }
-static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
+static method test2<T extends self::Class*>(self::test2::T* t2) → dynamic {
   if(self::test2::T*.{core::Type::==}(#C1)) {
     self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
   }
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.outline.expect
index 6efbb7d..e51a6e0 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.outline.expect
@@ -24,7 +24,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class* = self::Class*> on T* {
+extension BoundExtension<T extends self::Class*> on T* {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -32,13 +32,13 @@
   ;
 static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
   return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method BoundExtension|method2<T extends self::Class* = self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+static method BoundExtension|method2<T extends self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
   ;
-static method BoundExtension|get#method2<T extends self::Class* = self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+static method BoundExtension|get#method2<T extends self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
   return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
 static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class*
   ;
-static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic
+static method test2<T extends self::Class*>(self::test2::T* t2) → dynamic
   ;
 static method test3<T extends core::Object* = dynamic>(self::test3::T* t3) → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.transformed.expect
index a20912a..5b11e7e 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.transformed.expect
@@ -26,7 +26,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class* = self::Class*> on T* {
+extension BoundExtension<T extends self::Class*> on T* {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -34,9 +34,9 @@
   return #this;
 static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
   return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
-static method BoundExtension|method2<T extends self::Class* = self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+static method BoundExtension|method2<T extends self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
   return #this;
-static method BoundExtension|get#method2<T extends self::Class* = self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+static method BoundExtension|get#method2<T extends self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
   return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
 static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class* {
   if(t1 is self::SubClass*) {
@@ -44,7 +44,7 @@
   }
   return new self::Class::•();
 }
-static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
+static method test2<T extends self::Class*>(self::test2::T* t2) → dynamic {
   if(self::test2::T*.{core::Type::==}(#C1)) {
     self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
   }
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect
index 1786045..932e48a 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.expect
@@ -58,12 +58,12 @@
 }
 static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
+static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
   core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
 }
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
+static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
 static method _extension#0|get#property(lowered final self::Class1* #this) → core::int* {
   core::print("Extension1.property get on ${#this}");
   return #this.{self::Class1::field};
@@ -79,12 +79,12 @@
 }
 static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
+static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
   core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(4) as{TypeError} core::int*;
 }
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
+static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
 static method _extension#1|get#property(lowered final self::Class2* #this) → core::int* {
   core::print("Extension2.property get on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(5);
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect
index bca6081..7880975 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.outline.expect
@@ -54,10 +54,10 @@
   ;
 static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int*
+static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int*
   ;
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
+static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
 static method _extension#0|get#property(lowered final self::Class1* #this) → core::int*
   ;
 static method _extension#0|set#property(lowered final self::Class1* #this, core::int* value) → void
@@ -66,10 +66,10 @@
   ;
 static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int*
+static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int*
   ;
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
+static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
 static method _extension#1|get#property(lowered final self::Class2* #this) → core::int*
   ;
 static method _extension#1|set#property(lowered final self::Class2* #this, core::int* value) → void
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect
index 4e7371c..bfc173d 100644
--- a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.transformed.expect
@@ -58,12 +58,12 @@
 }
 static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
   return () → core::int* => self::_extension#0|method(#this);
-static method _extension#0|genericMethod<T extends core::num* = core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
+static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
   core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class1::field}.{core::num::+}(t) as{TypeError} core::int*;
 }
-static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
+static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
 static method _extension#0|get#property(lowered final self::Class1* #this) → core::int* {
   core::print("Extension1.property get on ${#this}");
   return #this.{self::Class1::field};
@@ -79,12 +79,12 @@
 }
 static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
   return () → core::int* => self::_extension#1|method(#this);
-static method _extension#1|genericMethod<T extends core::num* = core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
+static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
   core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T*}>(${t}) on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(t).{core::num::+}(4) as{TypeError} core::int*;
 }
-static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num* = core::num*>(T*) →* core::int*
-  return <T extends core::num* = core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
+static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
 static method _extension#1|get#property(lowered final self::Class2* #this) → core::int* {
   core::print("Extension2.property get on ${#this}");
   return #this.{self::Class2::field}.{core::num::+}(5);
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.expect
index d64170d..cd1a183 100644
--- a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  method bar<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X*>() → dynamic
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -23,7 +23,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
+  static method foo<Y extends core::Object*>() → self::A<self::B::foo::Y*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.outline.expect
index b5f4961..0828ddb 100644
--- a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 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* = self::A::X*>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X*>() → dynamic
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -21,7 +21,7 @@
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
+  static method foo<Y extends core::Object*>() → self::A<self::B::foo::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.transformed.expect
index d64170d..cd1a183 100644
--- a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  method bar<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X*>() → dynamic
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -23,7 +23,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
+  static method foo<Y extends core::Object*>() → self::A<self::B::foo::Y*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect
index 1bf550a..01f1570 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect
@@ -23,7 +23,7 @@
 
 typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
 typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
-class A<X extends core::String* = core::String*> extends core::Object {
+class A<X extends core::String*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect
index cdad149..ffcf750 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect
@@ -23,7 +23,7 @@
 
 typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
 typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
-class A<X extends core::String* = core::String*> extends core::Object {
+class A<X extends core::String*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect
index 1bf550a..01f1570 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
 
 typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
 typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
-class A<X extends core::String* = core::String*> extends core::Object {
+class A<X extends core::String*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/bug35470.dart.weak.expect b/pkg/front_end/testcases/general/bug35470.dart.weak.expect
index 4bb1bd3..42009f8 100644
--- a/pkg/front_end/testcases/general/bug35470.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bug35470.dart.weak.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  method foo<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic {}
+  method foo<generic-covariant-impl Y extends self::A::X*>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/bug35470.dart.weak.outline.expect b/pkg/front_end/testcases/general/bug35470.dart.weak.outline.expect
index bc8adee..bfe47d7 100644
--- a/pkg/front_end/testcases/general/bug35470.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bug35470.dart.weak.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* = self::A::X*>() → dynamic
+  method foo<generic-covariant-impl Y extends self::A::X*>() → dynamic
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/bug35470.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug35470.dart.weak.transformed.expect
index 4bb1bd3..42009f8 100644
--- a/pkg/front_end/testcases/general/bug35470.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug35470.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  method foo<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic {}
+  method foo<generic-covariant-impl Y extends self::A::X*>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/bug37476.dart.weak.expect b/pkg/front_end/testcases/general/bug37476.dart.weak.expect
index 112e0e4..bd16297 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.weak.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
+    return <S extends self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -21,7 +21,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends core::num* = core::num*> extends core::Object {
+class B<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/bug37476.dart.weak.outline.expect b/pkg/front_end/testcases/general/bug37476.dart.weak.outline.expect
index 7828759..112f56d 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends core::num* = core::num*> extends core::Object {
+class B<T extends 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/bug37476.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bug37476.dart.weak.transformed.expect
index 112e0e4..bd16297 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.weak.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
+    return <S extends self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -21,7 +21,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends core::num* = core::num*> extends core::Object {
+class B<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.expect b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.expect
index a03f477..c56828e 100644
--- a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.expect
+++ b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Class1<T extends core::Function* = core::Function*> extends core::Object {
+class Class1<T extends core::Function*> extends core::Object {
   generic-covariant-impl field self::Class1::T* field;
   constructor •(self::Class1::T* field) → self::Class1<self::Class1::T*>*
     : self::Class1::field = field, super core::Object::•()
@@ -36,7 +36,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class2<T extends (core::int*) →* core::String* = (core::int*) →* core::String*> extends core::Object {
+class Class2<T extends (core::int*) →* core::String*> extends core::Object {
   generic-covariant-impl field self::Class2::T* field;
   constructor •(self::Class2::T* field) → self::Class2<self::Class2::T*>*
     : self::Class2::field = field, super core::Object::•()
diff --git a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.outline.expect b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.outline.expect
index 139ef5e..654c962 100644
--- a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Class1<T extends core::Function* = core::Function*> extends core::Object {
+class Class1<T extends core::Function*> extends core::Object {
   generic-covariant-impl field self::Class1::T* field;
   constructor •(self::Class1::T* field) → self::Class1<self::Class1::T*>*
     ;
@@ -19,7 +19,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class2<T extends (core::int*) →* core::String* = (core::int*) →* core::String*> extends core::Object {
+class Class2<T extends (core::int*) →* core::String*> extends core::Object {
   generic-covariant-impl field self::Class2::T* field;
   constructor •(self::Class2::T* field) → self::Class2<self::Class2::T*>*
     ;
diff --git a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect
index 6388442..f7b5cfc 100644
--- a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Class1<T extends core::Function* = core::Function*> extends core::Object {
+class Class1<T extends core::Function*> extends core::Object {
   generic-covariant-impl field self::Class1::T* field;
   constructor •(self::Class1::T* field) → self::Class1<self::Class1::T*>*
     : self::Class1::field = field, super core::Object::•()
@@ -36,7 +36,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class2<T extends (core::int*) →* core::String* = (core::int*) →* core::String*> extends core::Object {
+class Class2<T extends (core::int*) →* core::String*> extends core::Object {
   generic-covariant-impl field self::Class2::T* field;
   constructor •(self::Class2::T* field) → self::Class2<self::Class2::T*>*
     : self::Class2::field = field, super core::Object::•()
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect
index a8b62fb..7453dc4 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect
@@ -513,7 +513,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Am2<X extends () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
     : super core::Object::•()
     ;
@@ -1128,8 +1128,8 @@
     : super self::_Km3&Object&Am3::•()
     ;
 }
-class Af1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
+class Af1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1142,8 +1142,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+class Bf1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1156,8 +1156,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
-  static factory foo<X extends () →* core::int* = () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
+class Cf1<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1170,8 +1170,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
+class Df1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1184,8 +1184,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+class Ef1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1198,8 +1198,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+class Ff1<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1212,8 +1212,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+class Gf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1226,8 +1226,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+class Hf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1240,8 +1240,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class If1<X extends core::Function* = core::Function*> extends core::Object {
-  static factory foo<X extends core::Function* = core::Function*>() → self::If1<self::If1::foo::X*>*
+class If1<X extends core::Function*> extends core::Object {
+  static factory foo<X extends core::Function*>() → self::If1<self::If1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1254,8 +1254,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+class Jf1<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1268,8 +1268,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1282,8 +1282,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+class Bf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1296,8 +1296,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+class Cf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1310,8 +1310,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
-  static factory foo<X extends () →* core::int* = () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
+class Df2<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1324,8 +1324,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+class Ef2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1338,8 +1338,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+class Ff2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1352,8 +1352,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+class Gf2<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1366,8 +1366,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+class Hf2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1380,8 +1380,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
+class If2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1394,8 +1394,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+class Jf2<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1408,8 +1408,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect
index def0418..cf63a80 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect
@@ -501,7 +501,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Am2<X extends () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -1093,8 +1093,8 @@
   synthetic constructor •() → self::Km3<self::Km3::Z*>*
     ;
 }
-class Af1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
+class Af1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1107,8 +1107,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+class Bf1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1121,8 +1121,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
-  static factory foo<X extends () →* core::int* = () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
+class Cf1<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1135,8 +1135,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
+class Df1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1149,8 +1149,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+class Ef1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1163,8 +1163,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+class Ff1<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1177,8 +1177,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+class Gf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1191,8 +1191,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+class Hf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1205,8 +1205,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class If1<X extends core::Function* = core::Function*> extends core::Object {
-  static factory foo<X extends core::Function* = core::Function*>() → self::If1<self::If1::foo::X*>*
+class If1<X extends core::Function*> extends core::Object {
+  static factory foo<X extends core::Function*>() → self::If1<self::If1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1219,8 +1219,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+class Jf1<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1233,8 +1233,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1247,8 +1247,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+class Bf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1261,8 +1261,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+class Cf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1275,8 +1275,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
-  static factory foo<X extends () →* core::int* = () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
+class Df2<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1289,8 +1289,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+class Ef2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1303,8 +1303,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+class Ff2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1317,8 +1317,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+class Gf2<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1331,8 +1331,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+class Hf2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1345,8 +1345,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
+class If2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1359,8 +1359,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+class Jf2<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1373,8 +1373,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect
index 7935b39..93e0a13 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect
@@ -513,7 +513,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Am2<X extends () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
     : super core::Object::•()
     ;
@@ -1128,8 +1128,8 @@
     : super self::_Km3&Object&Am3::•()
     ;
 }
-class Af1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
+class Af1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1142,8 +1142,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+class Bf1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1156,8 +1156,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
-  static factory foo<X extends () →* core::int* = () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
+class Cf1<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1170,8 +1170,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
+class Df1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1184,8 +1184,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+class Ef1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1198,8 +1198,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+class Ff1<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1212,8 +1212,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+class Gf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1226,8 +1226,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+class Hf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1240,8 +1240,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class If1<X extends core::Function* = core::Function*> extends core::Object {
-  static factory foo<X extends core::Function* = core::Function*>() → self::If1<self::If1::foo::X*>*
+class If1<X extends core::Function*> extends core::Object {
+  static factory foo<X extends core::Function*>() → self::If1<self::If1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1254,8 +1254,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+class Jf1<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1268,8 +1268,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1282,8 +1282,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+class Bf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1296,8 +1296,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::int*) →* dynamic = (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+class Cf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1310,8 +1310,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
-  static factory foo<X extends () →* core::int* = () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
+class Df2<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1324,8 +1324,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+class Ef2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1338,8 +1338,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
-  static factory foo<X extends () →* dynamic = () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+class Ff2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1352,8 +1352,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+class Gf2<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1366,8 +1366,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+class Hf2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1380,8 +1380,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
-  static factory foo<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
+class If2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1394,8 +1394,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+class Jf2<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -1408,8 +1408,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
-  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.expect
index 19ac8c4..79836e1 100644
--- a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.expect
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.expect
@@ -32,7 +32,7 @@
     : super self::C::•()
     ;
 }
-class G<T extends self::A* = self::A*> extends core::Object {
+class G<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.outline.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.outline.expect
index f0e2f4b..ec0b3ec 100644
--- a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.outline.expect
@@ -28,7 +28,7 @@
   synthetic constructor •() → self::D*
     ;
 }
-class G<T extends self::A* = self::A*> extends core::Object {
+class G<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::G<self::G::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.transformed.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.transformed.expect
index 19ac8c4..79836e1 100644
--- a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
     : super self::C::•()
     ;
 }
-class G<T extends self::A* = self::A*> extends core::Object {
+class G<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect
index 5716a4f..3144a2d 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect
@@ -93,7 +93,7 @@
   operator unary-() → self::C
     return this;
 }
-class Class<T extends self::A = self::A> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends self::A> extends core::Object /*hasConstConstructor*/  {
   const constructor •(self::Class::T t) → self::Class<self::Class::T>
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
                                  ^" in t.{self::A::unary-}(){() → self::A} as{TypeError,ForNonNullableByDefault} Never)
     ;
 }
-class Subclass<T extends self::A = self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+class Subclass<T extends self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
   const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
     : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
     ;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect
index 3afb32d..247eb18 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect
@@ -65,7 +65,7 @@
   operator unary-() → self::C
     ;
 }
-class Class<T extends self::A = self::A> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends self::A> extends core::Object /*hasConstConstructor*/  {
   const constructor •(self::Class::T t) → self::Class<self::Class::T>
     : super core::Object::•()
     ;
@@ -79,7 +79,7 @@
                                  ^" in t.{self::A::unary-}(){() → self::A} as{TypeError,ForNonNullableByDefault} Never)
     ;
 }
-class Subclass<T extends self::A = self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+class Subclass<T extends self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
   const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
     : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
     ;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect
index cc4f2ae..bb6d767 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect
@@ -93,7 +93,7 @@
   operator unary-() → self::C
     return this;
 }
-class Class<T extends self::A = self::A> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends self::A> extends core::Object /*hasConstConstructor*/  {
   const constructor •(self::Class::T t) → self::Class<self::Class::T>
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
                                  ^" in t.{self::A::unary-}(){() → self::A} as{TypeError,ForNonNullableByDefault} Never)
     ;
 }
-class Subclass<T extends self::A = self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+class Subclass<T extends self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
   const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
     : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
     ;
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.expect
index 02336a0..4ba2d78 100644
--- a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::S*>*
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
+  method method<generic-covariant-impl T extends self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -22,7 +22,7 @@
   synthetic constructor •() → self::B<self::B::S*>*
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
+  method method<generic-covariant-impl T extends self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -38,14 +38,14 @@
   synthetic constructor •() → self::C<self::C::S*>*
     : super self::A::•()
     ;
-  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
     return super.{self::A::method}<self::C::method::T*>(s);
 }
 class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
   synthetic constructor •() → self::D<self::D::S*>*
     : super self::A::•()
     ;
-  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
     return super.{self::A::method}<self::D::method::T*>(s);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.outline.expect
index 7b6fa81..066d863 100644
--- a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 class A<S extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::S*>*
     ;
-  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void
+  method method<generic-covariant-impl T extends self::A::S*>(generic-covariant-impl self::A::S* s) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -21,7 +21,7 @@
 class B<S extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::S*>*
     ;
-  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void
+  method method<generic-covariant-impl T extends self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -37,13 +37,13 @@
 class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
   synthetic constructor •() → self::C<self::C::S*>*
     ;
-  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
     return super.{self::A::method}<self::C::method::T*>(s);
 }
 class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
   synthetic constructor •() → self::D<self::D::S*>*
     ;
-  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
     return super.{self::A::method}<self::D::method::T*>(s);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.transformed.expect
index 02336a0..4ba2d78 100644
--- a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::S*>*
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl T extends self::A::S* = self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
+  method method<generic-covariant-impl T extends self::A::S*>(generic-covariant-impl self::A::S* s) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -22,7 +22,7 @@
   synthetic constructor •() → self::B<self::B::S*>*
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl T extends self::B::S* = self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
+  method method<generic-covariant-impl T extends self::B::S*>(covariant generic-covariant-impl self::B::S* s) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -38,14 +38,14 @@
   synthetic constructor •() → self::C<self::C::S*>*
     : super self::A::•()
     ;
-  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S* = self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
+  forwarding-stub forwarding-semi-stub method method<generic-covariant-impl T extends self::C::S*>(covariant generic-covariant-impl self::C::S* s) → void
     return super.{self::A::method}<self::C::method::T*>(s);
 }
 class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
   synthetic constructor •() → self::D<self::D::S*>*
     : super self::A::•()
     ;
-  forwarding-stub method method<generic-covariant-impl T extends self::D::S* = self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
+  forwarding-stub method method<generic-covariant-impl T extends self::D::S*>(covariant generic-covariant-impl self::D::S* s) → void
     return super.{self::A::method}<self::D::method::T*>(s);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.expect b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.expect
index cd6f676..ab69e1b 100644
--- a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.expect
@@ -94,5 +94,5 @@
     ;
   method handleEvent(invalid-type event, covariant invalid-type entry) → void {}
 }
-abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject = mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.outline.expect
index db57999..bac955b 100644
--- a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.outline.expect
@@ -81,5 +81,5 @@
   method handleEvent(invalid-type event, covariant invalid-type entry) → void
     ;
 }
-abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject = mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.transformed.expect
index 6019bb4..89640c3 100644
--- a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.transformed.expect
@@ -94,5 +94,5 @@
     ;
   method handleEvent(invalid-type event, covariant invalid-type entry) → void {}
 }
-abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject = mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.expect b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.expect
index 9db3393..8ead278 100644
--- a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.expect
+++ b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.expect
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass* = self::SuperClass*> = core::Object with self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin*/  {
+abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass*> = core::Object with self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class1&S&Mixin<self::_Class1&S&Mixin::T*, self::_Class1&S&Mixin::S*>*
     : super core::Object::•()
     ;
@@ -59,7 +59,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class1<T extends core::Object* = dynamic, S extends self::SuperClass* = self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
+class Class1<T extends core::Object* = dynamic, S extends self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
   synthetic constructor •() → self::Class1<self::Class1::T*, self::Class1::S*>*
     : super self::_Class1&S&Mixin::•()
     ;
diff --git a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.outline.expect b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.outline.expect
index c70de66..c6193d3 100644
--- a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.outline.expect
@@ -43,7 +43,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass* = self::SuperClass*> = core::Object with self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin*/  {
+abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass*> = core::Object with self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_Class1&S&Mixin<self::_Class1&S&Mixin::T*, self::_Class1&S&Mixin::S*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -57,7 +57,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class1<T extends core::Object* = dynamic, S extends self::SuperClass* = self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
+class Class1<T extends core::Object* = dynamic, S extends self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
   synthetic constructor •() → self::Class1<self::Class1::T*, self::Class1::S*>*
     ;
 }
diff --git a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.transformed.expect
index a62c5b1..3c6fc51 100644
--- a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.transformed.expect
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass* = self::SuperClass*> extends core::Object implements self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin,isEliminatedMixin*/  {
+abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass*> extends core::Object implements self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin,isEliminatedMixin*/  {
   synthetic constructor •() → self::_Class1&S&Mixin<self::_Class1&S&Mixin::T*, self::_Class1&S&Mixin::S*>*
     : super core::Object::•()
     ;
@@ -59,7 +59,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class1<T extends core::Object* = dynamic, S extends self::SuperClass* = self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
+class Class1<T extends core::Object* = dynamic, S extends self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
   synthetic constructor •() → self::Class1<self::Class1::T*, self::Class1::S*>*
     : super self::_Class1&S&Mixin::•()
     ;
diff --git a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.expect b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.expect
index 317b261..06e24b0 100644
--- a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.expect
@@ -15,7 +15,7 @@
 import self as mai;
 import "dart:core" as core;
 
-class DynamicDispatchRegistry<T extends core::Function* = core::Function*> extends core::Object {
+class DynamicDispatchRegistry<T extends core::Function*> extends core::Object {
   synthetic constructor •() → mai::DynamicDispatchRegistry<mai::DynamicDispatchRegistry::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.outline.expect
index cfc2e45..63c1b76 100644
--- a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 import self as self2;
 import "dart:core" as core;
 
-class DynamicDispatchRegistry<T extends core::Function* = core::Function*> extends core::Object {
+class DynamicDispatchRegistry<T extends core::Function*> extends core::Object {
   synthetic constructor •() → self2::DynamicDispatchRegistry<self2::DynamicDispatchRegistry::T*>*
     ;
   method register(generic-covariant-impl self2::DynamicDispatchRegistry::T* function) → self2::DynamicDispatchRegistry::T*
diff --git a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.transformed.expect
index 317b261..06e24b0 100644
--- a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
 import self as mai;
 import "dart:core" as core;
 
-class DynamicDispatchRegistry<T extends core::Function* = core::Function*> extends core::Object {
+class DynamicDispatchRegistry<T extends core::Function*> extends core::Object {
   synthetic constructor •() → mai::DynamicDispatchRegistry<mai::DynamicDispatchRegistry::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.expect b/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.expect
index ea6f457..fa6936b 100644
--- a/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.expect
@@ -35,7 +35,7 @@
 
 typedef G<invariant T extends core::Object? = dynamic> = (T%) → T%;
 static method test() → dynamic {
-  function local<T extends core::num = core::num>(T t) → T
+  function local<T extends core::num>(T t) → T
     return t;
   local.call<core::String>("");
   local.call<core::String>(throw "");
@@ -44,7 +44,7 @@
   let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/function_invocation_bounds.dart:13:8: Error: Expected 1 type arguments.
   local<int, String>(throw '');
        ^" in local.call<core::int, core::String>(throw "");
-  <T extends core::num = core::num>(T) → T f = local;
+  <T extends core::num>(T) → T f = local;
   f.call<core::String>("");
   f.call<core::String>(throw "");
   f.call<core::int>(0);
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.expect
index a1f9842..0d92c04 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.expect
@@ -32,7 +32,7 @@
            ^" in (#C3) as{TypeError} core::String*;
 static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
   return t;
-static method identityObject<T extends core::Object* = core::Object*>(self::identityObject::T* t) → self::identityObject::T*
+static method identityObject<T extends core::Object*>(self::identityObject::T* t) → self::identityObject::T*
   return t;
 static method identityList<T extends core::List<self::identityList::T*>* = core::List<dynamic>*>(self::identityList::T* t) → self::identityList::T*
   return t;
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.outline.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.outline.expect
index 1e430dd..3d00d77 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.outline.expect
@@ -7,7 +7,7 @@
 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* = core::Object*>(self::identityObject::T* t) → self::identityObject::T*
+static method identityObject<T extends core::Object*>(self::identityObject::T* t) → self::identityObject::T*
   ;
 static method identityList<T extends core::List<self::identityList::T*>* = core::List<dynamic>*>(self::identityList::T* t) → self::identityList::T*
   ;
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.transformed.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.transformed.expect
index a1f9842..0d92c04 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
            ^" in (#C3) as{TypeError} core::String*;
 static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
   return t;
-static method identityObject<T extends core::Object* = core::Object*>(self::identityObject::T* t) → self::identityObject::T*
+static method identityObject<T extends core::Object*>(self::identityObject::T* t) → self::identityObject::T*
   return t;
 static method identityList<T extends core::List<self::identityList::T*>* = core::List<dynamic>*>(self::identityList::T* t) → self::identityList::T*
   return t;
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.expect
index 0b9eef2..96838f0 100644
--- a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.expect
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<A extends core::num* = core::num*, B extends core::num* = core::num*>(self::add::A* a, self::add::B* b) → core::num*
+static method add<A extends core::num*, B extends core::num*>(self::add::A* a, self::add::B* b) → core::num*
   return a.{core::num::+}(b);
 static method test() → dynamic {
   core::int* x = let final Never* #t1 = invalid-expression "pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.outline.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.outline.expect
index c236efd..36becbd 100644
--- a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<A extends core::num* = core::num*, B extends core::num* = core::num*>(self::add::A* a, self::add::B* b) → core::num*
+static method add<A extends core::num*, B extends core::num*>(self::add::A* a, self::add::B* b) → core::num*
   ;
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.transformed.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.transformed.expect
index 0b9eef2..96838f0 100644
--- a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<A extends core::num* = core::num*, B extends core::num* = core::num*>(self::add::A* a, self::add::B* b) → core::num*
+static method add<A extends core::num*, B extends core::num*>(self::add::A* a, self::add::B* b) → core::num*
   return a.{core::num::+}(b);
 static method test() → dynamic {
   core::int* x = let final Never* #t1 = invalid-expression "pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.expect
index adf2f0d..509ac9e 100644
--- a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
-typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E2<unrelated T extends core::num*> = () →* void;
 typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
-typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
-typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
-typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef E4<unrelated T extends core::num*, unrelated S extends core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num*> = () →* void;
+typedef E6<unrelated T extends core::num*, unrelated S extends T* = core::num*> = () →* void;
 typedef F1 = <T extends core::Object* = dynamic>() →* void;
 typedef F2 = <T extends core::num* = dynamic>() →* void;
 typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
@@ -15,11 +15,11 @@
 typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
 typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
 typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
-typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num*> = <T extends X* = dynamic>() →* void;
 typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
-typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
-typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
-typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef G4<invariant X extends core::num*, invariant Y extends core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
 typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
 typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
 typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.outline.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.outline.expect
index 338c05f..cb01afe 100644
--- a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
-typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E2<unrelated T extends core::num*> = () →* void;
 typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
-typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
-typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
-typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef E4<unrelated T extends core::num*, unrelated S extends core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num*> = () →* void;
+typedef E6<unrelated T extends core::num*, unrelated S extends T* = core::num*> = () →* void;
 typedef F1 = <T extends core::Object* = dynamic>() →* void;
 typedef F2 = <T extends core::num* = dynamic>() →* void;
 typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
@@ -15,11 +15,11 @@
 typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
 typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
 typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
-typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num*> = <T extends X* = dynamic>() →* void;
 typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
-typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
-typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
-typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef G4<invariant X extends core::num*, invariant Y extends core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
 typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
 typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
 typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.transformed.expect
index adf2f0d..509ac9e 100644
--- a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
-typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E2<unrelated T extends core::num*> = () →* void;
 typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
-typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
-typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
-typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef E4<unrelated T extends core::num*, unrelated S extends core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num*> = () →* void;
+typedef E6<unrelated T extends core::num*, unrelated S extends T* = core::num*> = () →* void;
 typedef F1 = <T extends core::Object* = dynamic>() →* void;
 typedef F2 = <T extends core::num* = dynamic>() →* void;
 typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
@@ -15,11 +15,11 @@
 typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
 typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
 typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
-typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num*> = <T extends X* = dynamic>() →* void;
 typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
-typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
-typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
-typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef G4<invariant X extends core::num*, invariant Y extends core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
 typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
 typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
 typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.expect
index 9842a9b..5d0cc59 100644
--- a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.expect
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.expect
@@ -352,7 +352,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::num* = core::num*, S extends T* = core::num*> on core::int* {
+extension Extension<T extends core::num*, S extends T* = core::num*> on core::int* {
   get property1 = self::Extension|get#property1;
   get property2a = self::Extension|get#property2a;
   get property2b = self::Extension|get#property2b;
@@ -378,36 +378,36 @@
   static set property8b = set self::Extension|property8b;
   static set property9 = set self::Extension|property9;
 }
-static method Extension|get#property1<T extends core::num* = core::num*, S extends self::Extension|get#property1::T* = core::num*>(lowered final core::int* #this) → core::int*
+static method Extension|get#property1<T extends core::num*, S extends self::Extension|get#property1::T* = core::num*>(lowered final core::int* #this) → core::int*
   return 0;
-static method Extension|set#property1<T extends core::num* = core::num*, S extends self::Extension|set#property1::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
-static method Extension|get#property2a<T extends core::num* = core::num*, S extends self::Extension|get#property2a::T* = core::num*>(lowered final core::int* #this) → core::num*
+static method Extension|set#property1<T extends core::num*, S extends self::Extension|set#property1::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
+static method Extension|get#property2a<T extends core::num*, S extends self::Extension|get#property2a::T* = core::num*>(lowered final core::int* #this) → core::num*
   return 0;
-static method Extension|set#property2a<T extends core::num* = core::num*, S extends self::Extension|set#property2a::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
-static method Extension|get#property2b<T extends core::num* = core::num*, S extends self::Extension|get#property2b::T* = core::num*>(lowered final core::int* #this) → core::int*
+static method Extension|set#property2a<T extends core::num*, S extends self::Extension|set#property2a::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
+static method Extension|get#property2b<T extends core::num*, S extends self::Extension|get#property2b::T* = core::num*>(lowered final core::int* #this) → core::int*
   return 0;
-static method Extension|set#property2b<T extends core::num* = core::num*, S extends self::Extension|set#property2b::T* = core::num*>(lowered final core::int* #this, core::num* i) → void {}
-static method Extension|get#property3<T extends core::num* = core::num*, S extends self::Extension|get#property3::T* = core::num*>(lowered final core::int* #this) → core::String*
+static method Extension|set#property2b<T extends core::num*, S extends self::Extension|set#property2b::T* = core::num*>(lowered final core::int* #this, core::num* i) → void {}
+static method Extension|get#property3<T extends core::num*, S extends self::Extension|get#property3::T* = core::num*>(lowered final core::int* #this) → core::String*
   return "";
-static method Extension|set#property3<T extends core::num* = core::num*, S extends self::Extension|set#property3::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
-static method Extension|get#property4<T extends core::num* = core::num*, S extends self::Extension|get#property4::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property4::S*
+static method Extension|set#property3<T extends core::num*, S extends self::Extension|set#property3::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
+static method Extension|get#property4<T extends core::num*, S extends self::Extension|get#property4::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property4::S*
   return let final Never* #t1 = invalid-expression "pkg/front_end/testcases/general/getter_vs_setter_type.dart:133:22: Error: A value of type 'int' can't be assigned to a variable of type 'S'.
   S get property4 => 0; // ok
                      ^" in 0 as{TypeError} Never;
-static method Extension|set#property4<T extends core::num* = core::num*, S extends self::Extension|set#property4::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property4::S* i) → void {}
-static method Extension|get#property5a<T extends core::num* = core::num*, S extends self::Extension|get#property5a::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5a::S*
+static method Extension|set#property4<T extends core::num*, S extends self::Extension|set#property4::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property4::S* i) → void {}
+static method Extension|get#property5a<T extends core::num*, S extends self::Extension|get#property5a::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5a::S*
   return let final Never* #t2 = invalid-expression "pkg/front_end/testcases/general/getter_vs_setter_type.dart:136:23: Error: A value of type 'int' can't be assigned to a variable of type 'S'.
   S get property5a => 0; // ok
                       ^" in 0 as{TypeError} Never;
-static method Extension|set#property5a<T extends core::num* = core::num*, S extends self::Extension|set#property5a::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5a::T* i) → void {}
-static method Extension|get#property5b<T extends core::num* = core::num*, S extends self::Extension|get#property5b::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5b::T*
+static method Extension|set#property5a<T extends core::num*, S extends self::Extension|set#property5a::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5a::T* i) → void {}
+static method Extension|get#property5b<T extends core::num*, S extends self::Extension|get#property5b::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5b::T*
   return let final Never* #t3 = invalid-expression "pkg/front_end/testcases/general/getter_vs_setter_type.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'T'.
   T get property5b => 0; // ok
                       ^" in 0 as{TypeError} Never;
-static method Extension|set#property5b<T extends core::num* = core::num*, S extends self::Extension|set#property5b::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5b::S* i) → void {}
-static method Extension|get#property6<T extends core::num* = core::num*, S extends self::Extension|get#property6::T* = core::num*>(lowered final core::int* #this) → core::String*
+static method Extension|set#property5b<T extends core::num*, S extends self::Extension|set#property5b::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5b::S* i) → void {}
+static method Extension|get#property6<T extends core::num*, S extends self::Extension|get#property6::T* = core::num*>(lowered final core::int* #this) → core::String*
   return "";
-static method Extension|set#property6<T extends core::num* = core::num*, S extends self::Extension|set#property6::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property6::S* i) → void {}
+static method Extension|set#property6<T extends core::num*, S extends self::Extension|set#property6::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property6::S* i) → void {}
 static get Extension|property7() → core::int*
   return 0;
 static set Extension|property7(core::int* value) → void {}
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.outline.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.outline.expect
index 597b9c0..a903f97 100644
--- a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.outline.expect
@@ -335,7 +335,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension Extension<T extends core::num* = core::num*, S extends T* = core::num*> on core::int* {
+extension Extension<T extends core::num*, S extends T* = core::num*> on core::int* {
   get property1 = self::Extension|get#property1;
   get property2a = self::Extension|get#property2a;
   get property2b = self::Extension|get#property2b;
@@ -361,37 +361,37 @@
   static set property8b = set self::Extension|property8b;
   static set property9 = set self::Extension|property9;
 }
-static method Extension|get#property1<T extends core::num* = core::num*, S extends self::Extension|get#property1::T* = core::num*>(lowered final core::int* #this) → core::int*
+static method Extension|get#property1<T extends core::num*, S extends self::Extension|get#property1::T* = core::num*>(lowered final core::int* #this) → core::int*
   ;
-static method Extension|set#property1<T extends core::num* = core::num*, S extends self::Extension|set#property1::T* = core::num*>(lowered final core::int* #this, core::int* i) → void
+static method Extension|set#property1<T extends core::num*, S extends self::Extension|set#property1::T* = core::num*>(lowered final core::int* #this, core::int* i) → void
   ;
-static method Extension|get#property2a<T extends core::num* = core::num*, S extends self::Extension|get#property2a::T* = core::num*>(lowered final core::int* #this) → core::num*
+static method Extension|get#property2a<T extends core::num*, S extends self::Extension|get#property2a::T* = core::num*>(lowered final core::int* #this) → core::num*
   ;
-static method Extension|set#property2a<T extends core::num* = core::num*, S extends self::Extension|set#property2a::T* = core::num*>(lowered final core::int* #this, core::int* i) → void
+static method Extension|set#property2a<T extends core::num*, S extends self::Extension|set#property2a::T* = core::num*>(lowered final core::int* #this, core::int* i) → void
   ;
-static method Extension|get#property2b<T extends core::num* = core::num*, S extends self::Extension|get#property2b::T* = core::num*>(lowered final core::int* #this) → core::int*
+static method Extension|get#property2b<T extends core::num*, S extends self::Extension|get#property2b::T* = core::num*>(lowered final core::int* #this) → core::int*
   ;
-static method Extension|set#property2b<T extends core::num* = core::num*, S extends self::Extension|set#property2b::T* = core::num*>(lowered final core::int* #this, core::num* i) → void
+static method Extension|set#property2b<T extends core::num*, S extends self::Extension|set#property2b::T* = core::num*>(lowered final core::int* #this, core::num* i) → void
   ;
-static method Extension|get#property3<T extends core::num* = core::num*, S extends self::Extension|get#property3::T* = core::num*>(lowered final core::int* #this) → core::String*
+static method Extension|get#property3<T extends core::num*, S extends self::Extension|get#property3::T* = core::num*>(lowered final core::int* #this) → core::String*
   ;
-static method Extension|set#property3<T extends core::num* = core::num*, S extends self::Extension|set#property3::T* = core::num*>(lowered final core::int* #this, core::int* i) → void
+static method Extension|set#property3<T extends core::num*, S extends self::Extension|set#property3::T* = core::num*>(lowered final core::int* #this, core::int* i) → void
   ;
-static method Extension|get#property4<T extends core::num* = core::num*, S extends self::Extension|get#property4::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property4::S*
+static method Extension|get#property4<T extends core::num*, S extends self::Extension|get#property4::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property4::S*
   ;
-static method Extension|set#property4<T extends core::num* = core::num*, S extends self::Extension|set#property4::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property4::S* i) → void
+static method Extension|set#property4<T extends core::num*, S extends self::Extension|set#property4::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property4::S* i) → void
   ;
-static method Extension|get#property5a<T extends core::num* = core::num*, S extends self::Extension|get#property5a::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5a::S*
+static method Extension|get#property5a<T extends core::num*, S extends self::Extension|get#property5a::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5a::S*
   ;
-static method Extension|set#property5a<T extends core::num* = core::num*, S extends self::Extension|set#property5a::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5a::T* i) → void
+static method Extension|set#property5a<T extends core::num*, S extends self::Extension|set#property5a::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5a::T* i) → void
   ;
-static method Extension|get#property5b<T extends core::num* = core::num*, S extends self::Extension|get#property5b::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5b::T*
+static method Extension|get#property5b<T extends core::num*, S extends self::Extension|get#property5b::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5b::T*
   ;
-static method Extension|set#property5b<T extends core::num* = core::num*, S extends self::Extension|set#property5b::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5b::S* i) → void
+static method Extension|set#property5b<T extends core::num*, S extends self::Extension|set#property5b::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5b::S* i) → void
   ;
-static method Extension|get#property6<T extends core::num* = core::num*, S extends self::Extension|get#property6::T* = core::num*>(lowered final core::int* #this) → core::String*
+static method Extension|get#property6<T extends core::num*, S extends self::Extension|get#property6::T* = core::num*>(lowered final core::int* #this) → core::String*
   ;
-static method Extension|set#property6<T extends core::num* = core::num*, S extends self::Extension|set#property6::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property6::S* i) → void
+static method Extension|set#property6<T extends core::num*, S extends self::Extension|set#property6::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property6::S* i) → void
   ;
 static get Extension|property7() → core::int*
   ;
diff --git a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.expect b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.expect
index 8661180..a8b24bc 100644
--- a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.expect
+++ b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.expect
@@ -49,19 +49,19 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class _D&C&B<T extends core::num* = core::num*> = self::C with self::B<self::_D&C&B::T*> /*isAnonymousMixin*/  {
+abstract class _D&C&B<T extends core::num*> = self::C with self::B<self::_D&C&B::T*> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_D&C&B<self::_D&C&B::T*>*
     : super self::C::•()
     ;
   forwarding-stub method foo(generic-covariant-impl core::num* x) → dynamic
     return super.{self::C::foo}(x);
 }
-class D<T extends core::num* = core::num*> extends self::_D&C&B<self::D::T*> {
+class D<T extends core::num*> extends self::_D&C&B<self::D::T*> {
   synthetic constructor •() → self::D<self::D::T*>*
     : super self::_D&C&B::•()
     ;
 }
-class E<T extends core::num* = core::num*> = self::C with self::B<self::E::T*> {
+class E<T extends core::num*> = self::C with self::B<self::E::T*> {
   synthetic constructor •() → self::E<self::E::T*>*
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.outline.expect b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.outline.expect
index 613c5f9..63349f7 100644
--- a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.outline.expect
@@ -47,18 +47,18 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class _D&C&B<T extends core::num* = core::num*> = self::C with self::B<self::_D&C&B::T*> /*isAnonymousMixin*/  {
+abstract class _D&C&B<T extends core::num*> = self::C with self::B<self::_D&C&B::T*> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_D&C&B<self::_D&C&B::T*>*
     : super self::C::•()
     ;
   forwarding-stub method foo(generic-covariant-impl core::num* x) → dynamic
     return super.{self::C::foo}(x);
 }
-class D<T extends core::num* = core::num*> extends self::_D&C&B<self::D::T*> {
+class D<T extends core::num*> extends self::_D&C&B<self::D::T*> {
   synthetic constructor •() → self::D<self::D::T*>*
     ;
 }
-class E<T extends core::num* = core::num*> = self::C with self::B<self::E::T*> {
+class E<T extends core::num*> = self::C with self::B<self::E::T*> {
   synthetic constructor •() → self::E<self::E::T*>*
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.transformed.expect b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.transformed.expect
index d2f5898..c1432a4 100644
--- a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.transformed.expect
@@ -49,19 +49,19 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class _D&C&B<T extends core::num* = core::num*> extends self::C implements self::B<self::_D&C&B::T*> /*isAnonymousMixin,isEliminatedMixin*/  {
+abstract class _D&C&B<T extends core::num*> extends self::C implements self::B<self::_D&C&B::T*> /*isAnonymousMixin,isEliminatedMixin*/  {
   synthetic constructor •() → self::_D&C&B<self::_D&C&B::T*>*
     : super self::C::•()
     ;
   forwarding-stub method foo(generic-covariant-impl core::num* x) → dynamic
     return super.{self::C::foo}(x);
 }
-class D<T extends core::num* = core::num*> extends self::_D&C&B<self::D::T*> {
+class D<T extends core::num*> extends self::_D&C&B<self::D::T*> {
   synthetic constructor •() → self::D<self::D::T*>*
     : super self::_D&C&B::•()
     ;
 }
-class E<T extends core::num* = core::num*> extends self::C implements self::B<self::E::T*> /*isEliminatedMixin*/  {
+class E<T extends core::num*> extends self::C implements self::B<self::E::T*> /*isEliminatedMixin*/  {
   synthetic constructor •() → self::E<self::E::T*>*
     : super self::C::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue38812.dart.weak.expect b/pkg/front_end/testcases/general/issue38812.dart.weak.expect
index 07ce423..1bcd793 100644
--- a/pkg/front_end/testcases/general/issue38812.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue38812.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef G<unrelated X extends core::Object* = dynamic> = () →* void;
-class A<X extends () →* void = () →* void, Y extends () →* void = () →* void> extends core::Object {
+class A<X extends () →* void, Y extends () →* void> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*, self::A::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue38812.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue38812.dart.weak.outline.expect
index b09f203..d9a199c 100644
--- a/pkg/front_end/testcases/general/issue38812.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue38812.dart.weak.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef G<unrelated X extends core::Object* = dynamic> = () →* void;
-class A<X extends () →* void = () →* void, Y extends () →* void = () →* void> extends core::Object {
+class A<X extends () →* void, Y extends () →* void> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*, self::A::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/issue38812.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue38812.dart.weak.transformed.expect
index 07ce423..1bcd793 100644
--- a/pkg/front_end/testcases/general/issue38812.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue38812.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef G<unrelated X extends core::Object* = dynamic> = () →* void;
-class A<X extends () →* void = () →* void, Y extends () →* void = () →* void> extends core::Object {
+class A<X extends () →* void, Y extends () →* void> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*, self::A::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue38943.dart.weak.expect b/pkg/front_end/testcases/general/issue38943.dart.weak.expect
index c85022a..c723406 100644
--- a/pkg/front_end/testcases/general/issue38943.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue38943.dart.weak.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends () →* void = () →* void> extends core::Object {
+class D<X extends () →* void> extends core::Object {
   constructor _() → self::D<self::D::X*>*
     : super core::Object::•() {}
-  static factory foo<X extends () →* void = () →* void>() → self::D<self::D::foo::X*>*
+  static factory foo<X extends () →* void>() → self::D<self::D::foo::X*>*
     return new self::D::_<self::D::foo::X*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue38943.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue38943.dart.weak.outline.expect
index 0c892f9..7c3fcaf 100644
--- a/pkg/front_end/testcases/general/issue38943.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue38943.dart.weak.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends () →* void = () →* void> extends core::Object {
+class D<X extends () →* void> extends core::Object {
   constructor _() → self::D<self::D::X*>*
     ;
-  static factory foo<X extends () →* void = () →* void>() → self::D<self::D::foo::X*>*
+  static factory foo<X extends () →* void>() → self::D<self::D::foo::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue38943.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue38943.dart.weak.transformed.expect
index c85022a..c723406 100644
--- a/pkg/front_end/testcases/general/issue38943.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue38943.dart.weak.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends () →* void = () →* void> extends core::Object {
+class D<X extends () →* void> extends core::Object {
   constructor _() → self::D<self::D::X*>*
     : super core::Object::•() {}
-  static factory foo<X extends () →* void = () →* void>() → self::D<self::D::foo::X*>*
+  static factory foo<X extends () →* void>() → self::D<self::D::foo::X*>*
     return new self::D::_<self::D::foo::X*>();
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue39344.dart.weak.expect b/pkg/front_end/testcases/general/issue39344.dart.weak.expect
index 5fdc524a..07a4d30 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.weak.expect
@@ -37,7 +37,7 @@
     : super self::A::•()
     ;
 }
-class Class<T extends self::A* = self::A*> extends core::Object {
+class Class<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue39344.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue39344.dart.weak.outline.expect
index fbf21ce..03e1065 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.weak.outline.expect
@@ -20,7 +20,7 @@
   synthetic constructor •() → self::B*
     ;
 }
-class Class<T extends self::A* = self::A*> extends core::Object {
+class Class<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T*>*
     ;
   method method1a(generic-covariant-impl self::Class::T* t) → void
diff --git a/pkg/front_end/testcases/general/issue39344.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue39344.dart.weak.transformed.expect
index ce3f707..7fe41a0 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.weak.transformed.expect
@@ -37,7 +37,7 @@
     : super self::A::•()
     ;
 }
-class Class<T extends self::A* = self::A*> extends core::Object {
+class Class<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue43721.dart.weak.expect b/pkg/front_end/testcases/general/issue43721.dart.weak.expect
index c204fd6..4ca7943 100644
--- a/pkg/front_end/testcases/general/issue43721.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue43721.dart.weak.expect
@@ -15,8 +15,8 @@
 
 import "dart:async";
 
-static method ok<T extends FutureOr<core::num*>* = FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
-static method error<T extends FutureOr<core::int*>* = FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
+static method ok<T extends FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
+static method error<T extends FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
 static method bar(core::bool* condition) → dynamic {
   FutureOr<core::int*>* x = null;
   core::num* n = 1;
diff --git a/pkg/front_end/testcases/general/issue43721.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue43721.dart.weak.outline.expect
index 84a6f86..710bffc 100644
--- a/pkg/front_end/testcases/general/issue43721.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue43721.dart.weak.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static method ok<T extends FutureOr<core::num*>* = FutureOr<core::num*>*>(self::ok::T* t) → dynamic
+static method ok<T extends FutureOr<core::num*>*>(self::ok::T* t) → dynamic
   ;
-static method error<T extends FutureOr<core::int*>* = FutureOr<core::int*>*>(self::error::T* t) → dynamic
+static method error<T extends FutureOr<core::int*>*>(self::error::T* t) → dynamic
   ;
 static method bar(core::bool* condition) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/issue43721.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue43721.dart.weak.transformed.expect
index c204fd6..4ca7943 100644
--- a/pkg/front_end/testcases/general/issue43721.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue43721.dart.weak.transformed.expect
@@ -15,8 +15,8 @@
 
 import "dart:async";
 
-static method ok<T extends FutureOr<core::num*>* = FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
-static method error<T extends FutureOr<core::int*>* = FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
+static method ok<T extends FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
+static method error<T extends FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
 static method bar(core::bool* condition) → dynamic {
   FutureOr<core::int*>* x = null;
   core::num* n = 1;
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.expect
index 136f9b1..645587c 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.expect
@@ -61,7 +61,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::int* = core::int*> extends core::Object {
+class A<X extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect
index 7f40fcf..2131965 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::int* = core::int*> extends core::Object {
+class A<X extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect
index 136f9b1..645587c 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect
@@ -61,7 +61,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::int* = core::int*> extends core::Object {
+class A<X extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/issue45330.dart.weak.expect b/pkg/front_end/testcases/general/issue45330.dart.weak.expect
index c315320..22c456a 100644
--- a/pkg/front_end/testcases/general/issue45330.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45330.dart.weak.expect
@@ -28,9 +28,9 @@
 part issue45330_lib.dart;
 static method genericMethod<T extends core::Object? = dynamic>() → void {}
 static method testInMain() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
 static method main() → dynamic {}
 static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
diff --git a/pkg/front_end/testcases/general/issue45330.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45330.dart.weak.transformed.expect
index c315320..22c456a 100644
--- a/pkg/front_end/testcases/general/issue45330.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45330.dart.weak.transformed.expect
@@ -28,9 +28,9 @@
 part issue45330_lib.dart;
 static method genericMethod<T extends core::Object? = dynamic>() → void {}
 static method testInMain() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
 static method main() → dynamic {}
 static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
diff --git a/pkg/front_end/testcases/general/issue45660.dart.weak.expect b/pkg/front_end/testcases/general/issue45660.dart.weak.expect
index cd197e9..f65680e 100644
--- a/pkg/front_end/testcases/general/issue45660.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45660.dart.weak.expect
@@ -10,7 +10,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field <T extends core::num* = dynamic>(T*) →* T* extendsNumReturnArg = <S extends core::num* = core::num*>(S* s) → S* => s;
+static field <T extends core::num* = dynamic>(T*) →* T* extendsNumReturnArg = <S extends core::num*>(S* s) → S* => s;
 static method functionInvocations() → dynamic {
   self::extendsNumReturnArg.call<Null>(null);
   self::extendsNumReturnArg.call<core::String*>("");
diff --git a/pkg/front_end/testcases/general/issue45660.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45660.dart.weak.transformed.expect
index cd197e9..f65680e 100644
--- a/pkg/front_end/testcases/general/issue45660.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue45660.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field <T extends core::num* = dynamic>(T*) →* T* extendsNumReturnArg = <S extends core::num* = core::num*>(S* s) → S* => s;
+static field <T extends core::num* = dynamic>(T*) →* T* extendsNumReturnArg = <S extends core::num*>(S* s) → S* => s;
 static method functionInvocations() → dynamic {
   self::extendsNumReturnArg.call<Null>(null);
   self::extendsNumReturnArg.call<core::String*>("");
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.expect
index 5465909..fce001a 100644
--- a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.expect
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends self::A* = self::A*> extends core::Object {
+class C<T extends self::A*> extends core::Object {
   generic-covariant-impl field self::C::T* _field = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.outline.expect
index 4366b2f..8b4326c 100644
--- a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends self::A* = self::A*> extends core::Object {
+class C<T extends 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/mixin_inherited_setter_for_mixed_in_field.dart.weak.transformed.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.transformed.expect
index 9828c0d..cd6518b 100644
--- a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends self::A* = self::A*> extends core::Object {
+class C<T extends self::A*> extends core::Object {
   generic-covariant-impl field self::C::T* _field = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.weak.expect b/pkg/front_end/testcases/general/nested_variance.dart.weak.expect
index e1dd3c7..ab01f23 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.weak.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.weak.expect
@@ -6,9 +6,9 @@
 typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
 typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
 typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
 typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
@@ -60,7 +60,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num* = core::num*> extends core::Object {
+class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AcovBound<self::AcovBound::X*, self::AcovBound::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -90,7 +90,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num* = core::num*> extends core::Object {
+class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AinvBound<self::AinvBound::X*, self::AinvBound::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.weak.outline.expect b/pkg/front_end/testcases/general/nested_variance.dart.weak.outline.expect
index 1172b5e..c2384c9 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.weak.outline.expect
@@ -6,9 +6,9 @@
 typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
 typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
 typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
 typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
@@ -57,7 +57,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num* = core::num*> extends core::Object {
+class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AcovBound<self::AcovBound::X*, self::AcovBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,7 +71,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -85,7 +85,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num* = core::num*> extends core::Object {
+class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AinvBound<self::AinvBound::X*, self::AinvBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.weak.transformed.expect b/pkg/front_end/testcases/general/nested_variance.dart.weak.transformed.expect
index e1dd3c7..ab01f23 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.weak.transformed.expect
@@ -6,9 +6,9 @@
 typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
 typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
 typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
 typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
@@ -60,7 +60,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num* = core::num*> extends core::Object {
+class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AcovBound<self::AcovBound::X*, self::AcovBound::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -90,7 +90,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num* = core::num*> extends core::Object {
+class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num*> extends core::Object {
   synthetic constructor •() → self::AinvBound<self::AinvBound::X*, self::AinvBound::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.expect
index 39064e3..2f9cd4a 100644
--- a/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -370,28 +370,28 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
+    c.{self::C::setter12} = <S extends core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
+    c.{self::C::setter13} = <S extends core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter14} = <S extends core::num* = core::num*>(S* s) → S* => s;
+    c.{self::C::setter14} = <S extends core::num*>(S* s) → S* => s;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
+    c.{self::C::setter15} = (<S extends core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,28 +463,28 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
+    c.{self::C::method12}(<S extends core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
+    c.{self::C::method13}(<S extends core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method14}(<S extends core::num* = core::num*>(S* s) → S* => s);
+    c.{self::C::method14}(<S extends core::num*>(S* s) → S* => s);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
+    c.{self::C::method15}((<S extends core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.transformed.expect
index 39064e3..2f9cd4a 100644
--- a/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -370,28 +370,28 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
+    c.{self::C::setter12} = <S extends core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
+    c.{self::C::setter13} = <S extends core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter14} = <S extends core::num* = core::num*>(S* s) → S* => s;
+    c.{self::C::setter14} = <S extends core::num*>(S* s) → S* => s;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
+    c.{self::C::setter15} = (<S extends core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,28 +463,28 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
+    c.{self::C::method12}(<S extends core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
+    c.{self::C::method13}(<S extends core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method14}(<S extends core::num* = core::num*>(S* s) → S* => s);
+    c.{self::C::method14}(<S extends core::num*>(S* s) → S* => s);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
+    c.{self::C::method15}((<S extends core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.expect b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.expect
index 6972fb1..02008c5 100644
--- a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.expect
+++ b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class Class<E extends self::Element? = self::Element?> extends core::Object {
+class Class<E extends self::Element?> extends core::Object {
   generic-covariant-impl field self::Class::E? element;
   constructor •(self::Class::E? element) → self::Class<self::Class::E%>
     : self::Class::element = element, super core::Object::•()
diff --git a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.outline.expect b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.outline.expect
index 199055c..b66e3a9 100644
--- a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::Element
     ;
 }
-class Class<E extends self::Element? = self::Element?> extends core::Object {
+class Class<E extends self::Element?> extends core::Object {
   generic-covariant-impl field self::Class::E? element;
   constructor •(self::Class::E? element) → self::Class<self::Class::E%>
     ;
diff --git a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.transformed.expect
index 6405a73..c5d8066 100644
--- a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     : super core::Object::•()
     ;
 }
-class Class<E extends self::Element? = self::Element?> extends core::Object {
+class Class<E extends self::Element?> extends core::Object {
   generic-covariant-impl field self::Class::E? element;
   constructor •(self::Class::E? element) → self::Class<self::Class::E%>
     : self::Class::element = element, super core::Object::•()
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
index 9ada94b..05a7185 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.expect
@@ -40,7 +40,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::X* = self::X*> extends self::A {
+class B<T extends self::X*> extends self::A {
   constructor •() → self::B<self::B::T*>*
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
index fe27ae5..3cc1659 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.outline.expect
@@ -37,7 +37,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::X* = self::X*> extends self::A {
+class B<T extends self::X*> extends self::A {
   constructor •() → self::B<self::B::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
index 35b0942..5fac4ba 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.transformed.expect
@@ -40,7 +40,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::X* = self::X*> extends self::A {
+class B<T extends self::X*> extends self::A {
   constructor •() → self::B<self::B::T*>*
     : super self::A::•()
     ;
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.expect
index 0afec65..6324f0a 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Foo<T extends self::X* = self::X*> extends core::Object {
+class Foo<T extends self::X*> extends core::Object {
   generic-covariant-impl field self::Foo::T* x;
   constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
     : this self::Foo::_internal(x: _init as{TypeError} self::Foo::T*)
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.outline.expect
index 6210541..b816f4d 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Foo<T extends self::X* = self::X*> extends core::Object {
+class Foo<T extends 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/redirecting_initializer_arguments_assignable_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.transformed.expect
index 0afec65..6324f0a 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Foo<T extends self::X* = self::X*> extends core::Object {
+class Foo<T extends self::X*> extends core::Object {
   generic-covariant-impl field self::Foo::T* x;
   constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
     : this self::Foo::_internal(x: _init as{TypeError} self::Foo::T*)
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.expect
index b21e661..c61d2e4 100644
--- a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.expect
@@ -6,9 +6,9 @@
 typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
 typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
 typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
 typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.outline.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.outline.expect
index e79bd82..8e8cfa3 100644
--- a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.outline.expect
@@ -6,9 +6,9 @@
 typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
 typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
 typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
 typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.transformed.expect
index b21e661..c61d2e4 100644
--- a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.transformed.expect
@@ -6,9 +6,9 @@
 typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
 typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
 typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
-typedef FcovBound<X extends core::num* = core::num*> = () →* X*;
-typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
-typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
 typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.expect
index 3700707..1e70230 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.expect
@@ -10,7 +10,7 @@
 import self as self;
 import "dart:core" as core;
 
-class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+class DynamicClass<T extends dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
   generic-covariant-impl field self::DynamicClass::T* field1;
   generic-covariant-impl field self::DynamicClass::T* field2;
   constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
@@ -29,7 +29,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+class NumClass<T extends core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
   generic-covariant-impl field self::NumClass::T* field1;
   generic-covariant-impl field self::NumClass::S* field2;
   constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
@@ -53,7 +53,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int*> extends core::Object {
   generic-covariant-impl field self::Class::X0* field0 = null;
   generic-covariant-impl field self::Class::X1* field1 = null;
   generic-covariant-impl field self::Class::X2* field2 = null;
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.outline.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.outline.expect
index 9a25328..b02e918 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+class DynamicClass<T extends dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
   generic-covariant-impl field self::DynamicClass::T* field1;
   generic-covariant-impl field self::DynamicClass::T* field2;
   constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
@@ -20,7 +20,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+class NumClass<T extends core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
   generic-covariant-impl field self::NumClass::T* field1;
   generic-covariant-impl field self::NumClass::S* field2;
   constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
@@ -40,7 +40,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int*> extends core::Object {
   generic-covariant-impl field self::Class::X0* field0;
   generic-covariant-impl field self::Class::X1* field1;
   generic-covariant-impl field self::Class::X2* field2;
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.transformed.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.transformed.expect
index dbc33c0..d9c7800 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 import self as self;
 import "dart:core" as core;
 
-class DynamicClass<T extends dynamic = dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+class DynamicClass<T extends dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
   generic-covariant-impl field self::DynamicClass::T* field1;
   generic-covariant-impl field self::DynamicClass::T* field2;
   constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
@@ -29,7 +29,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class NumClass<T extends core::num* = core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+class NumClass<T extends core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
   generic-covariant-impl field self::NumClass::T* field1;
   generic-covariant-impl field self::NumClass::S* field2;
   constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
@@ -53,7 +53,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int*> extends core::Object {
   generic-covariant-impl field self::Class::X0* field0 = null;
   generic-covariant-impl field self::Class::X1* field1 = null;
   generic-covariant-impl field self::Class::X2* field2 = null;
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.weak.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.weak.expect
index 10cd814..bf4731f 100644
--- a/pkg/front_end/testcases/general/unsound_promotion.dart.weak.expect
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.weak.expect
@@ -50,7 +50,7 @@
     ;
 }
 static field core::List<self::A*>* list;
-static method g<T extends self::A* = self::A*>(self::g::T* t) → core::List<self::g::T*>* {
+static method g<T extends self::A*>(self::g::T* t) → core::List<self::g::T*>* {
   self::list = <self::g::T*>[];
   core::print(self::list.{core::Object::runtimeType});
   return self::list as{TypeError} core::List<self::g::T*>*;
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.weak.outline.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.weak.outline.expect
index 4d2b9c0..6b3902f 100644
--- a/pkg/front_end/testcases/general/unsound_promotion.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.weak.outline.expect
@@ -35,7 +35,7 @@
     ;
 }
 static field core::List<self::A*>* list;
-static method g<T extends self::A* = self::A*>(self::g::T* t) → core::List<self::g::T*>*
+static method g<T extends 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/vm_type_ops.dart.weak.expect b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.expect
index f5999a8..2091c88 100644
--- a/pkg/front_end/testcases/general/vm_type_ops.dart.weak.expect
+++ b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.expect
@@ -55,10 +55,10 @@
     return w as{TypeError,ForDynamic} core::Map<self::D::P*, self::D::Q*>*;
   }
 }
-class E<P extends core::String* = core::String*> extends core::Object {
-  static factory •<P extends core::String* = core::String*>() → self::E<self::E::•::P*>*
+class E<P extends core::String*> extends core::Object {
+  static factory •<P extends core::String*>() → self::E<self::E::•::P*>*
     return null;
-  method foo6<generic-covariant-impl T extends self::E::P* = self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void {}
+  method foo6<generic-covariant-impl T extends self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -74,8 +74,8 @@
   synthetic constructor •() → self::F<self::F::T*>*
     : super core::Object::•()
     ;
-  abstract method foo7<generic-covariant-impl Q extends self::F::T* = self::F::T*>(self::F::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
-  abstract method foo8<generic-covariant-impl Q extends self::F::T* = self::F::T*>(self::F::foo8::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
+  abstract method foo7<generic-covariant-impl Q extends self::F::T*>(self::F::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
+  abstract method foo8<generic-covariant-impl Q extends self::F::T*>(self::F::foo8::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -91,7 +91,7 @@
   synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
-  method foo7<generic-covariant-impl Q extends self::G::T* = self::G::T*>(self::G::foo7::Q* a, core::int* b, generic-covariant-impl self::G::T* c) → void {}
+  method foo7<generic-covariant-impl Q extends self::G::T*>(self::G::foo7::Q* a, core::int* b, generic-covariant-impl self::G::T* c) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -107,8 +107,8 @@
   synthetic constructor •() → self::H<self::H::T*>*
     : super self::G::•()
     ;
-  method foo8<generic-covariant-impl Q extends self::H::T* = self::H::T*>(self::H::foo8::Q* a, covariant core::int* b, generic-covariant-impl self::H::T* c) → void {}
-  forwarding-stub method foo7<generic-covariant-impl Q extends self::H::T* = self::H::T*>(self::H::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::H::T* c) → void
+  method foo8<generic-covariant-impl Q extends self::H::T*>(self::H::foo8::Q* a, covariant core::int* b, generic-covariant-impl self::H::T* c) → void {}
+  forwarding-stub method foo7<generic-covariant-impl Q extends self::H::T*>(self::H::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::H::T* c) → void
     return super.{self::G::foo7}<self::H::foo7::Q*>(a, b, c);
 }
 static field core::List<core::Iterable<dynamic>*>* globalVar;
diff --git a/pkg/front_end/testcases/general/vm_type_ops.dart.weak.outline.expect b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.outline.expect
index c37c149..679e7c3 100644
--- a/pkg/front_end/testcases/general/vm_type_ops.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.outline.expect
@@ -35,10 +35,10 @@
   method foo4(dynamic w) → core::Map<self::D::P*, self::D::Q*>*
     ;
 }
-class E<P extends core::String* = core::String*> extends core::Object {
-  static factory •<P extends core::String* = core::String*>() → self::E<self::E::•::P*>*
+class E<P extends core::String*> extends core::Object {
+  static factory •<P extends core::String*>() → self::E<self::E::•::P*>*
     ;
-  method foo6<generic-covariant-impl T extends self::E::P* = self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void
+  method foo6<generic-covariant-impl T extends self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -54,8 +54,8 @@
 abstract class F<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::F<self::F::T*>*
     ;
-  abstract method foo7<generic-covariant-impl Q extends self::F::T* = self::F::T*>(self::F::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
-  abstract method foo8<generic-covariant-impl Q extends self::F::T* = self::F::T*>(self::F::foo8::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
+  abstract method foo7<generic-covariant-impl Q extends self::F::T*>(self::F::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
+  abstract method foo8<generic-covariant-impl Q extends self::F::T*>(self::F::foo8::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -70,7 +70,7 @@
 class G<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::G<self::G::T*>*
     ;
-  method foo7<generic-covariant-impl Q extends self::G::T* = self::G::T*>(self::G::foo7::Q* a, core::int* b, generic-covariant-impl self::G::T* c) → void
+  method foo7<generic-covariant-impl Q extends self::G::T*>(self::G::foo7::Q* a, core::int* b, generic-covariant-impl self::G::T* c) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -86,9 +86,9 @@
 class H<T extends core::Object* = dynamic> extends self::G<self::H::T*> implements self::F<self::H::T*> {
   synthetic constructor •() → self::H<self::H::T*>*
     ;
-  method foo8<generic-covariant-impl Q extends self::H::T* = self::H::T*>(self::H::foo8::Q* a, covariant core::int* b, generic-covariant-impl self::H::T* c) → void
+  method foo8<generic-covariant-impl Q extends self::H::T*>(self::H::foo8::Q* a, covariant core::int* b, generic-covariant-impl self::H::T* c) → void
     ;
-  forwarding-stub method foo7<generic-covariant-impl Q extends self::H::T* = self::H::T*>(self::H::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::H::T* c) → void
+  forwarding-stub method foo7<generic-covariant-impl Q extends self::H::T*>(self::H::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::H::T* c) → void
     return super.{self::G::foo7}<self::H::foo7::Q*>(a, b, c);
 }
 static field core::List<core::Iterable<dynamic>*>* globalVar;
diff --git a/pkg/front_end/testcases/general/vm_type_ops.dart.weak.transformed.expect b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.transformed.expect
index 63d1a23..ce44cfa 100644
--- a/pkg/front_end/testcases/general/vm_type_ops.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.transformed.expect
@@ -55,10 +55,10 @@
     return w as{TypeError,ForDynamic} core::Map<self::D::P*, self::D::Q*>*;
   }
 }
-class E<P extends core::String* = core::String*> extends core::Object {
-  static factory •<P extends core::String* = core::String*>() → self::E<self::E::•::P*>*
+class E<P extends core::String*> extends core::Object {
+  static factory •<P extends core::String*>() → self::E<self::E::•::P*>*
     return null;
-  method foo6<generic-covariant-impl T extends self::E::P* = self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void {}
+  method foo6<generic-covariant-impl T extends self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -74,8 +74,8 @@
   synthetic constructor •() → self::F<self::F::T*>*
     : super core::Object::•()
     ;
-  abstract method foo7<generic-covariant-impl Q extends self::F::T* = self::F::T*>(self::F::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
-  abstract method foo8<generic-covariant-impl Q extends self::F::T* = self::F::T*>(self::F::foo8::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
+  abstract method foo7<generic-covariant-impl Q extends self::F::T*>(self::F::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
+  abstract method foo8<generic-covariant-impl Q extends self::F::T*>(self::F::foo8::Q* a, covariant core::num* b, generic-covariant-impl self::F::T* c) → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -91,7 +91,7 @@
   synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
-  method foo7<generic-covariant-impl Q extends self::G::T* = self::G::T*>(self::G::foo7::Q* a, core::int* b, generic-covariant-impl self::G::T* c) → void {}
+  method foo7<generic-covariant-impl Q extends self::G::T*>(self::G::foo7::Q* a, core::int* b, generic-covariant-impl self::G::T* c) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -107,8 +107,8 @@
   synthetic constructor •() → self::H<self::H::T*>*
     : super self::G::•()
     ;
-  method foo8<generic-covariant-impl Q extends self::H::T* = self::H::T*>(self::H::foo8::Q* a, covariant core::int* b, generic-covariant-impl self::H::T* c) → void {}
-  forwarding-stub method foo7<generic-covariant-impl Q extends self::H::T* = self::H::T*>(self::H::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::H::T* c) → void
+  method foo8<generic-covariant-impl Q extends self::H::T*>(self::H::foo8::Q* a, covariant core::int* b, generic-covariant-impl self::H::T* c) → void {}
+  forwarding-stub method foo7<generic-covariant-impl Q extends self::H::T*>(self::H::foo7::Q* a, covariant core::num* b, generic-covariant-impl self::H::T* c) → void
     return super.{self::G::foo7}<self::H::foo7::Q*>(a, b, c);
 }
 static field core::List<core::Iterable<dynamic>*>* globalVar;
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect
index 56d2323..a688b79 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect
@@ -61,7 +61,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::int* = core::int*> extends core::Object {
+class A<X extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
@@ -93,7 +93,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E<X extends self::A<core::num*>* = self::A<core::num*>*> on self::A<core::int*>* {
+extension E<X extends self::A<core::num*>*> on self::A<core::int*>* {
   static field fieldOfE = self::E|fieldOfE;
   method fooOfE = self::E|fooOfE;
   tearoff fooOfE = self::E|get#fooOfE;
@@ -103,14 +103,14 @@
   tearoff bazOfE = self::E|get#bazOfE;
 }
 static field self::A<core::num*>* E|fieldOfE;
-static method E|fooOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
+static method E|fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
   return null;
-static method E|get#fooOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
+static method E|get#fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
   return () → self::A<core::num*>* => self::E|fooOfE<self::E|get#fooOfE::X*>(#this);
-static method E|barOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void {}
-static method E|get#barOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
+static method E|barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void {}
+static method E|get#barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
   return (self::A<core::num*>* a) → void => self::E|barOfE<self::E|get#barOfE::X*>(#this, a);
-static method E|bazOfE<X extends self::A<core::num*>* = self::A<core::num*>*, Y extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void {}
-static method E|get#bazOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>* = self::A<core::num*>*>() →* void
-  return <Y extends self::A<core::num*>* = self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
+static method E|bazOfE<X extends self::A<core::num*>*, Y extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void {}
+static method E|get#bazOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>*>() →* void
+  return <Y extends self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect
index 82ff41e..f1bac31 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect
@@ -61,7 +61,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::int* = core::int*> extends core::Object {
+class A<X extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -91,7 +91,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E<X extends self::A<core::num*>* = self::A<core::num*>*> on self::A<core::int*>* {
+extension E<X extends self::A<core::num*>*> on self::A<core::int*>* {
   static field fieldOfE = self::E|fieldOfE;
   method fooOfE = self::E|fooOfE;
   tearoff fooOfE = self::E|get#fooOfE;
@@ -101,17 +101,17 @@
   tearoff bazOfE = self::E|get#bazOfE;
 }
 static field self::A<core::num*>* E|fieldOfE;
-static method E|fooOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
+static method E|fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
   ;
-static method E|get#fooOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
+static method E|get#fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
   return () → self::A<core::num*>* => self::E|fooOfE<self::E|get#fooOfE::X*>(#this);
-static method E|barOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void
+static method E|barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void
   ;
-static method E|get#barOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
+static method E|get#barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
   return (self::A<core::num*>* a) → void => self::E|barOfE<self::E|get#barOfE::X*>(#this, a);
-static method E|bazOfE<X extends self::A<core::num*>* = self::A<core::num*>*, Y extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void
+static method E|bazOfE<X extends self::A<core::num*>*, Y extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void
   ;
-static method E|get#bazOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>* = self::A<core::num*>*>() →* void
-  return <Y extends self::A<core::num*>* = self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
+static method E|get#bazOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>*>() →* void
+  return <Y extends self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect
index 56d2323..a688b79 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect
@@ -61,7 +61,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::int* = core::int*> extends core::Object {
+class A<X extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
@@ -93,7 +93,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-extension E<X extends self::A<core::num*>* = self::A<core::num*>*> on self::A<core::int*>* {
+extension E<X extends self::A<core::num*>*> on self::A<core::int*>* {
   static field fieldOfE = self::E|fieldOfE;
   method fooOfE = self::E|fooOfE;
   tearoff fooOfE = self::E|get#fooOfE;
@@ -103,14 +103,14 @@
   tearoff bazOfE = self::E|get#bazOfE;
 }
 static field self::A<core::num*>* E|fieldOfE;
-static method E|fooOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
+static method E|fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
   return null;
-static method E|get#fooOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
+static method E|get#fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
   return () → self::A<core::num*>* => self::E|fooOfE<self::E|get#fooOfE::X*>(#this);
-static method E|barOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void {}
-static method E|get#barOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
+static method E|barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void {}
+static method E|get#barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
   return (self::A<core::num*>* a) → void => self::E|barOfE<self::E|get#barOfE::X*>(#this, a);
-static method E|bazOfE<X extends self::A<core::num*>* = self::A<core::num*>*, Y extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void {}
-static method E|get#bazOfE<X extends self::A<core::num*>* = self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>* = self::A<core::num*>*>() →* void
-  return <Y extends self::A<core::num*>* = self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
+static method E|bazOfE<X extends self::A<core::num*>*, Y extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void {}
+static method E|get#bazOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>*>() →* void
+  return <Y extends self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect
index 6ab9190..5d340a4 100644
--- a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.expect
@@ -56,7 +56,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect
index 6ab9190..5d340a4 100644
--- a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.strong.transformed.expect
@@ -56,7 +56,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect
index 6ab9190..5d340a4 100644
--- a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.expect
@@ -56,7 +56,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect
index edc7f22..a2d0339 100644
--- a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.outline.expect
@@ -28,7 +28,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     ;
 }
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect
index 6ab9190..5d340a4 100644
--- a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.transformed.expect
@@ -56,7 +56,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.expect
index 92b41bb..189f2c4 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.expect
@@ -15,9 +15,9 @@
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c7 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c8 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c9 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T>();
-  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
+  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
   mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c11 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
-  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
+  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
 }
 
 library /*isNonNullableByDefault*/;
@@ -30,37 +30,37 @@
 typedef exp4 = <T extends core::Object? = dynamic>(T%) → void;
 typedef exp5 = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T;
 typedef exp6 = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%;
-class C1<X extends <T extends core::Object? = dynamic>(T%) → T% = <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
+class C1<X extends <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
   constructor •() → mai::C1<mai::C1::X>
     : super core::Object::•() {
     mai::expect(#C1, mai::C1::X);
   }
 }
-class C2<X extends <T extends core::Object? = dynamic>() → void = <T extends core::Object? = dynamic>() → void> extends core::Object {
+class C2<X extends <T extends core::Object? = dynamic>() → void> extends core::Object {
   constructor •() → mai::C2<mai::C2::X>
     : super core::Object::•() {
     mai::expect(#C2, mai::C2::X);
   }
 }
-class C3<X extends <T extends core::Object? = dynamic>() → T% = <T extends core::Object? = dynamic>() → T%> extends core::Object {
+class C3<X extends <T extends core::Object? = dynamic>() → T%> extends core::Object {
   constructor •() → mai::C3<mai::C3::X>
     : super core::Object::•() {
     mai::expect(#C3, mai::C3::X);
   }
 }
-class C4<X extends <T extends core::Object? = dynamic>(T%) → void = <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
+class C4<X extends <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
   constructor •() → mai::C4<mai::C4::X>
     : super core::Object::•() {
     mai::expect(#C4, mai::C4::X);
   }
 }
-class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
+class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
   constructor •() → mai::C5<mai::C5::X>
     : super core::Object::•() {
     mai::expect(#C5, mai::C5::X);
   }
 }
-class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T% = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
+class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
   constructor •() → mai::C6<mai::C6::X>
     : super core::Object::•() {
     mai::expect(#C6, mai::C6::X);
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.transformed.expect
index 92b41bb..189f2c4 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.strong.transformed.expect
@@ -15,9 +15,9 @@
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c7 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c8 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c9 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T>();
-  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
+  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
   mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c11 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
-  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
+  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
 }
 
 library /*isNonNullableByDefault*/;
@@ -30,37 +30,37 @@
 typedef exp4 = <T extends core::Object? = dynamic>(T%) → void;
 typedef exp5 = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T;
 typedef exp6 = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%;
-class C1<X extends <T extends core::Object? = dynamic>(T%) → T% = <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
+class C1<X extends <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
   constructor •() → mai::C1<mai::C1::X>
     : super core::Object::•() {
     mai::expect(#C1, mai::C1::X);
   }
 }
-class C2<X extends <T extends core::Object? = dynamic>() → void = <T extends core::Object? = dynamic>() → void> extends core::Object {
+class C2<X extends <T extends core::Object? = dynamic>() → void> extends core::Object {
   constructor •() → mai::C2<mai::C2::X>
     : super core::Object::•() {
     mai::expect(#C2, mai::C2::X);
   }
 }
-class C3<X extends <T extends core::Object? = dynamic>() → T% = <T extends core::Object? = dynamic>() → T%> extends core::Object {
+class C3<X extends <T extends core::Object? = dynamic>() → T%> extends core::Object {
   constructor •() → mai::C3<mai::C3::X>
     : super core::Object::•() {
     mai::expect(#C3, mai::C3::X);
   }
 }
-class C4<X extends <T extends core::Object? = dynamic>(T%) → void = <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
+class C4<X extends <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
   constructor •() → mai::C4<mai::C4::X>
     : super core::Object::•() {
     mai::expect(#C4, mai::C4::X);
   }
 }
-class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
+class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
   constructor •() → mai::C5<mai::C5::X>
     : super core::Object::•() {
     mai::expect(#C5, mai::C5::X);
   }
 }
-class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T% = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
+class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
   constructor •() → mai::C6<mai::C6::X>
     : super core::Object::•() {
     mai::expect(#C6, mai::C6::X);
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect
index e1e7067..941af3f 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.expect
@@ -15,9 +15,9 @@
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c7 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c8 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c9 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T>();
-  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
+  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
   mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c11 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
-  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
+  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
 }
 
 library /*isNonNullableByDefault*/;
@@ -30,37 +30,37 @@
 typedef exp4 = <T extends core::Object? = dynamic>(T%) → void;
 typedef exp5 = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T;
 typedef exp6 = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%;
-class C1<X extends <T extends core::Object? = dynamic>(T%) → T% = <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
+class C1<X extends <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
   constructor •() → mai::C1<mai::C1::X>
     : super core::Object::•() {
     mai::expect(#C1, mai::C1::X);
   }
 }
-class C2<X extends <T extends core::Object? = dynamic>() → void = <T extends core::Object? = dynamic>() → void> extends core::Object {
+class C2<X extends <T extends core::Object? = dynamic>() → void> extends core::Object {
   constructor •() → mai::C2<mai::C2::X>
     : super core::Object::•() {
     mai::expect(#C2, mai::C2::X);
   }
 }
-class C3<X extends <T extends core::Object? = dynamic>() → T% = <T extends core::Object? = dynamic>() → T%> extends core::Object {
+class C3<X extends <T extends core::Object? = dynamic>() → T%> extends core::Object {
   constructor •() → mai::C3<mai::C3::X>
     : super core::Object::•() {
     mai::expect(#C3, mai::C3::X);
   }
 }
-class C4<X extends <T extends core::Object? = dynamic>(T%) → void = <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
+class C4<X extends <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
   constructor •() → mai::C4<mai::C4::X>
     : super core::Object::•() {
     mai::expect(#C4, mai::C4::X);
   }
 }
-class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
+class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
   constructor •() → mai::C5<mai::C5::X>
     : super core::Object::•() {
     mai::expect(#C5, mai::C5::X);
   }
 }
-class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T% = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
+class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
   constructor •() → mai::C6<mai::C6::X>
     : super core::Object::•() {
     mai::expect(#C6, mai::C6::X);
@@ -76,6 +76,6 @@
   #C2 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* void)
   #C3 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* T*)
   #C4 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T*) →* void)
-  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S* = <S extends core::Object? = dynamic>(S*) →* S*>(T*) →* T*)
-  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S* = S*, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
+  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S*>(T*) →* T*)
+  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S*, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
 }
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.outline.expect
index b9ccc27..ba9fc54 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.outline.expect
@@ -16,27 +16,27 @@
 typedef exp4 = <T extends core::Object? = dynamic>(T%) → void;
 typedef exp5 = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T;
 typedef exp6 = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%;
-class C1<X extends <T extends core::Object? = dynamic>(T%) → T% = <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
+class C1<X extends <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
   constructor •() → self2::C1<self2::C1::X>
     ;
 }
-class C2<X extends <T extends core::Object? = dynamic>() → void = <T extends core::Object? = dynamic>() → void> extends core::Object {
+class C2<X extends <T extends core::Object? = dynamic>() → void> extends core::Object {
   constructor •() → self2::C2<self2::C2::X>
     ;
 }
-class C3<X extends <T extends core::Object? = dynamic>() → T% = <T extends core::Object? = dynamic>() → T%> extends core::Object {
+class C3<X extends <T extends core::Object? = dynamic>() → T%> extends core::Object {
   constructor •() → self2::C3<self2::C3::X>
     ;
 }
-class C4<X extends <T extends core::Object? = dynamic>(T%) → void = <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
+class C4<X extends <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
   constructor •() → self2::C4<self2::C4::X>
     ;
 }
-class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
+class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
   constructor •() → self2::C5<self2::C5::X>
     ;
 }
-class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T% = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
+class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
   constructor •() → self2::C6<self2::C6::X>
     ;
 }
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect
index e1e7067..941af3f 100644
--- a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.transformed.expect
@@ -15,9 +15,9 @@
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c7 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C4<<T extends core::Object? = dynamic>(T%) → void> c8 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
   mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c9 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T>();
-  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
+  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
   mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c11 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
-  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
+  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
 }
 
 library /*isNonNullableByDefault*/;
@@ -30,37 +30,37 @@
 typedef exp4 = <T extends core::Object? = dynamic>(T%) → void;
 typedef exp5 = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T;
 typedef exp6 = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%;
-class C1<X extends <T extends core::Object? = dynamic>(T%) → T% = <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
+class C1<X extends <T extends core::Object? = dynamic>(T%) → T%> extends core::Object {
   constructor •() → mai::C1<mai::C1::X>
     : super core::Object::•() {
     mai::expect(#C1, mai::C1::X);
   }
 }
-class C2<X extends <T extends core::Object? = dynamic>() → void = <T extends core::Object? = dynamic>() → void> extends core::Object {
+class C2<X extends <T extends core::Object? = dynamic>() → void> extends core::Object {
   constructor •() → mai::C2<mai::C2::X>
     : super core::Object::•() {
     mai::expect(#C2, mai::C2::X);
   }
 }
-class C3<X extends <T extends core::Object? = dynamic>() → T% = <T extends core::Object? = dynamic>() → T%> extends core::Object {
+class C3<X extends <T extends core::Object? = dynamic>() → T%> extends core::Object {
   constructor •() → mai::C3<mai::C3::X>
     : super core::Object::•() {
     mai::expect(#C3, mai::C3::X);
   }
 }
-class C4<X extends <T extends core::Object? = dynamic>(T%) → void = <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
+class C4<X extends <T extends core::Object? = dynamic>(T%) → void> extends core::Object {
   constructor •() → mai::C4<mai::C4::X>
     : super core::Object::•() {
     mai::expect(#C4, mai::C4::X);
   }
 }
-class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T = <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
+class C5<X extends <T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> extends core::Object {
   constructor •() → mai::C5<mai::C5::X>
     : super core::Object::•() {
     mai::expect(#C5, mai::C5::X);
   }
 }
-class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T% = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
+class C6<X extends <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> extends core::Object {
   constructor •() → mai::C6<mai::C6::X>
     : super core::Object::•() {
     mai::expect(#C6, mai::C6::X);
@@ -76,6 +76,6 @@
   #C2 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* void)
   #C3 = TypeLiteralConstant(<T extends core::Object? = dynamic>() →* T*)
   #C4 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T*) →* void)
-  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S* = <S extends core::Object? = dynamic>(S*) →* S*>(T*) →* T*)
-  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S* = S*, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
+  #C5 = TypeLiteralConstant(<T extends <S extends core::Object? = dynamic>(S*) →* S*>(T*) →* T*)
+  #C6 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*, <V extends S*, U extends core::Object? = dynamic>(T*, U*, V*, core::Map<S*, U*>*) →* V*) →* T*)
 }
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect
index 493cc77..17eab83 100644
--- a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect
index 493cc77..17eab83 100644
--- a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect
index c1ead73..d081a19 100644
--- a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect
index 778e91b..7735bd6 100644
--- a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.outline.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     ;
 }
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect
index c1ead73..d081a19 100644
--- a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
     : super core::Object::•()
     ;
 }
-class Class<T extends <S extends core::Object? = dynamic>(S%) → void = <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
   synthetic constructor •() → self::Class<self::Class::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect
index d7ddced..0054d6c 100644
--- a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.expect
@@ -45,12 +45,12 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
-class D<S extends core::num = core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
+class D<S extends core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::S, self::D::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect
index d7ddced..0054d6c 100644
--- a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.strong.transformed.expect
@@ -45,12 +45,12 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
-class D<S extends core::num = core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
+class D<S extends core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::S, self::D::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect
index 338bb8d..b60d2ce 100644
--- a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.expect
@@ -45,12 +45,12 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
-class D<S extends core::num = core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
+class D<S extends core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::S, self::D::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect
index 229b1bb..71f6cda 100644
--- a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.outline.expect
@@ -45,12 +45,12 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
-class D<S extends core::num = core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
+class D<S extends core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::S, self::D::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect
index 338bb8d..b60d2ce 100644
--- a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.transformed.expect
@@ -45,12 +45,12 @@
     : super core::Object::•()
     ;
 }
-class C<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
 }
-class D<S extends core::num = core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
+class D<S extends core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::S, self::D::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.expect
index bf8ebf6..156f3fb 100644
--- a/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.expect
@@ -18,9 +18,9 @@
 part issue45330_lib.dart;
 static method genericMethod<T extends core::Object? = dynamic>() → void {}
 static method testInMain() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
 static method main() → dynamic {}
 static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
diff --git a/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.transformed.expect
index bf8ebf6..156f3fb 100644
--- a/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/issue45330.dart.strong.transformed.expect
@@ -18,9 +18,9 @@
 part issue45330_lib.dart;
 static method genericMethod<T extends core::Object? = dynamic>() → void {}
 static method testInMain() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
 static method main() → dynamic {}
 static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
diff --git a/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.expect
index bf8ebf6..156f3fb 100644
--- a/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.expect
@@ -18,9 +18,9 @@
 part issue45330_lib.dart;
 static method genericMethod<T extends core::Object? = dynamic>() → void {}
 static method testInMain() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
 static method main() → dynamic {}
 static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
diff --git a/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.transformed.expect
index bf8ebf6..156f3fb 100644
--- a/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.transformed.expect
@@ -18,9 +18,9 @@
 part issue45330_lib.dart;
 static method genericMethod<T extends core::Object? = dynamic>() → void {}
 static method testInMain() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
 static method main() → dynamic {}
 static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
-  self::genericMethod<<T extends invalid-type = invalid-type>() → void>();
+  self::genericMethod<<T extends invalid-type>() → void>();
 }
diff --git a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.expect
index 0777872..3c45ce6 100644
--- a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.expect
@@ -12,13 +12,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
index 0777872..3c45ce6 100644
--- a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
@@ -12,13 +12,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.expect
index 0777872..3c45ce6 100644
--- a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.expect
@@ -12,13 +12,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.outline.expect
index 13fcc95..98c0d38 100644
--- a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.outline.expect
@@ -10,13 +10,13 @@
   synthetic constructor •() → self::B
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   ;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
index 0777872..3c45ce6 100644
--- a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
@@ -12,13 +12,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.expect
index 52d8793..f970a2a 100644
--- a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.expect
@@ -1,5 +1,5 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 
-static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic = dynamic>() → dynamic>() → dynamic {}
+static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic>() → dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.transformed.expect
index 52d8793..f970a2a 100644
--- a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.strong.transformed.expect
@@ -1,5 +1,5 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 
-static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic = dynamic>() → dynamic>() → dynamic {}
+static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic>() → dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.expect
index 52d8793..f970a2a 100644
--- a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.expect
@@ -1,5 +1,5 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 
-static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic = dynamic>() → dynamic>() → dynamic {}
+static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic>() → dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.outline.expect
index 3b0732a..e413c7d 100644
--- a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.outline.expect
@@ -1,7 +1,7 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 
-static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic = dynamic>() → dynamic>() → dynamic
+static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic>() → dynamic>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.transformed.expect
index 52d8793..f970a2a 100644
--- a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.transformed.expect
@@ -1,5 +1,5 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 
-static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic = dynamic>() → dynamic>() → dynamic {}
+static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic>() → dynamic>() → dynamic {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.expect
index dd20ce4..e853954 100644
--- a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.expect
@@ -13,13 +13,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
index dd20ce4..e853954 100644
--- a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.strong.transformed.expect
@@ -13,13 +13,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.expect
index dd20ce4..e853954 100644
--- a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.expect
@@ -13,13 +13,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.outline.expect
index 1fbe2f1..7c86aa6 100644
--- a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.outline.expect
@@ -11,13 +11,13 @@
   synthetic constructor •() → self::B
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   ;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
index dd20ce4..e853954 100644
--- a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.transformed.expect
@@ -13,13 +13,13 @@
     : super self::A::•()
     ;
 }
-class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::Z>
     : super core::Object::•()
     ;
 }
 static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
   return throw 42;
-static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic = <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.1.expect
index 83dfce6..596001e 100644
--- a/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.1.expect
@@ -3,7 +3,7 @@
 
   import "package:flutter/framework.dart";
 
-  abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
+  abstract class AfterLayoutMixin<T extends fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
     abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
     abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
     abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
@@ -27,7 +27,7 @@
     mixin-super-stub method toString() → dart.core::String
       return super.{fra::Diagnosticable::toString}();
   }
-  abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+  abstract class State<T extends fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
     generic-covariant-impl field fra::State::T? _widget = null;
     synthetic constructor •() → fra::State<fra::State::T>
       : super fra::_State&Object&Diagnosticable::•()
diff --git a/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.2.expect
index 7d7406e..f1cc6fa 100644
--- a/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/flutter_issue_66122.yaml.world.2.expect
@@ -3,7 +3,7 @@
 
   import "package:flutter/framework.dart";
 
-  abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
+  abstract class AfterLayoutMixin<T extends fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/  {
     abstract member-signature get _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
     abstract member-signature set _widget(generic-covariant-impl aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
     abstract member-signature method toString() → dart.core::String*; -> fra::_State&Object&Diagnosticable::toString
@@ -27,7 +27,7 @@
     mixin-super-stub method toString() → dart.core::String
       return super.{fra::Diagnosticable::toString}();
   }
-  abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+  abstract class State<T extends fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
     generic-covariant-impl field fra::State::T? _widget = null;
     synthetic constructor •() → fra::State<fra::State::T>
       : super fra::_State&Object&Diagnosticable::•()
diff --git a/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.1.expect b/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.1.expect
index f12602b..3d2f012 100644
--- a/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.1.expect
@@ -12,7 +12,7 @@
 //                     ^^^
 //
 
-  class Bar<X extends invalid-type = invalid-type> extends dart.core::Object {
+  class Bar<X extends invalid-type> extends dart.core::Object {
     synthetic constructor •() → lib::Bar<lib::Bar::X*>*
       : super dart.core::Object::•()
       ;
@@ -32,7 +32,7 @@
 
   import "org-dartlang-test:///lib.dart";
 
-  class Foo<X extends lib::Bar<invalid-type>* = lib::Bar<invalid-type>*> extends dart.core::Object {
+  class Foo<X extends lib::Bar<invalid-type>*> extends dart.core::Object {
     synthetic constructor •() → main::Foo<main::Foo::X*>*
       : super dart.core::Object::•()
       ;
diff --git a/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.2.expect b/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.2.expect
index 5ad635e..4033273 100644
--- a/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.2.expect
@@ -12,7 +12,7 @@
 //                     ^^^
 //
 
-  class Bar<X extends invalid-type = invalid-type> extends dart.core::Object {
+  class Bar<X extends invalid-type> extends dart.core::Object {
     synthetic constructor •() → lib::Bar<lib::Bar::X*>*
       : super dart.core::Object::•()
       ;
diff --git a/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.3.expect b/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.3.expect
index fab0774..3c1d034 100644
--- a/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/reissue_errors_6.yaml.world.3.expect
@@ -3,7 +3,7 @@
 
   import "org-dartlang-test:///main.dart";
 
-  class Bar<X extends main::Foo<Null>* = main::Foo<Null>*> extends dart.core::Object {
+  class Bar<X extends main::Foo<Null>*> extends dart.core::Object {
     synthetic constructor •() → lib::Bar<lib::Bar::X*>*
       : super dart.core::Object::•()
       ;
@@ -23,7 +23,7 @@
 
   import "org-dartlang-test:///lib.dart";
 
-  class Foo<X extends lib::Bar<main::Foo<Null>*>* = lib::Bar<main::Foo<Null>*>*> extends dart.core::Object {
+  class Foo<X extends lib::Bar<main::Foo<Null>*>*> extends dart.core::Object {
     synthetic constructor •() → main::Foo<main::Foo::X*>*
       : super dart.core::Object::•()
       ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.expect
index dc47257..7a1c1c0 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.expect
@@ -22,7 +22,7 @@
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A* = self::A*> extends core::Object {
+class Foo<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.outline.expect
index 20ef2cd..3f5622c 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.outline.expect
@@ -20,7 +20,7 @@
   synthetic constructor •() → self::B*
     ;
 }
-class Foo<T extends self::A* = self::A*> extends core::Object {
+class Foo<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.transformed.expect
index dc47257..7a1c1c0 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.transformed.expect
@@ -22,7 +22,7 @@
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A* = self::A*> extends core::Object {
+class Foo<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect
index 8445171..706d512 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect
@@ -41,7 +41,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends self::A* = self::A*> extends core::Object {
+class C<T extends self::A*> extends core::Object {
   constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.outline.expect
index a91a655f..9a32b9b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.outline.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<T extends self::A* = self::A*> extends core::Object {
+class C<T extends self::A*> extends core::Object {
   constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.expect
index f64a716..c79ff6d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
   final field self::C::T* x;
   const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<T extends core::num* = core::num*> extends core::Object /*hasConstConstructor*/  {
+class D<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.outline.expect
index 11e4ec2..0b30da0d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
   final field self::C::T* x;
   const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<T extends core::num* = core::num*> extends core::Object /*hasConstConstructor*/  {
+class D<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.transformed.expect
index f64a716..c79ff6d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object /*hasConstConstructor*/  {
+class C<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
   final field self::C::T* x;
   const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<T extends core::num* = core::num*> extends core::Object /*hasConstConstructor*/  {
+class D<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.expect
index b512907..3569bc6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.expect
@@ -11,11 +11,11 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern* = core::Pattern*> extends core::Object {
+class Foo<T extends core::Pattern*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl U extends self::Foo::T* = self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
+  method method<generic-covariant-impl U extends self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
     return u;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.outline.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.outline.expect
index d2565cf..981c3c1 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern* = core::Pattern*> extends core::Object {
+class Foo<T extends core::Pattern*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
-  method method<generic-covariant-impl U extends self::Foo::T* = self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
+  method method<generic-covariant-impl U extends self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
index 91a24d9..527c4b0 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.expect
@@ -36,7 +36,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::num* = core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
+  method m<T extends core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.outline.expect
index 4f1f11c..0c12d64 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.outline.expect
@@ -8,7 +8,7 @@
 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*
+  method m<T extends core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
index a5a6c34..3783f0e 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.transformed.expect
@@ -36,7 +36,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::num* = core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
+  method m<T extends core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.expect
index 3cf3930..0b511ab 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.expect
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+class Bar<T extends core::Iterable<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.outline.expect
index fb24a4a..a8d39ff 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.outline.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+class Bar<T extends core::Iterable<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     ;
   method foo(generic-covariant-impl self::Bar::T* t) → void
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.transformed.expect
index 2b13c7f..37f2947 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.transformed.expect
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+class Bar<T extends core::Iterable<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.expect
index 0c59f14..c01f6d8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.expect
@@ -50,7 +50,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
+class Bar<T extends asy::Stream<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.outline.expect
index 98b90b7..3b83fec 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.outline.expect
@@ -20,7 +20,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
+class Bar<T extends asy::Stream<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     ;
   method foo(generic-covariant-impl self::Bar::T* t) → dynamic async 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.transformed.expect
index 2b08fb6..9b13665 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.transformed.expect
@@ -51,7 +51,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
+class Bar<T extends asy::Stream<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.expect
index 8b892ed..0fb60dc 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+class B<T extends self::A<core::int*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.outline.expect
index d2cbeee..e676290 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+class B<T extends self::A<core::int*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.transformed.expect
index 8b892ed..0fb60dc 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+class B<T extends self::A<core::int*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.expect
index 7654a70..0612d0f 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+class B<T extends self::A<core::int*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.outline.expect
index 6aea523..8a8c77b 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+class B<T extends self::A<core::int*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.transformed.expect
index 7654a70..0612d0f 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+class B<T extends self::A<core::int*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.expect
index b9fff9c..731ae28 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+class B<T extends self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.outline.expect
index ca700cd..f7e09d3 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+class B<T extends self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.transformed.expect
index b9fff9c..731ae28 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+class B<T extends self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.expect
index 002ee58..09072c4 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.outline.expect
index 0757181..5cb5fd6 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.transformed.expect
index 002ee58..09072c4 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.expect
index 002ee58..09072c4 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.outline.expect
index 0757181..5cb5fd6 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.transformed.expect
index 002ee58..09072c4 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int* = core::int*> extends core::Object {
+class A<T extends core::int*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.expect
index f2d000e..1fb9971 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.outline.expect
index a968144..1338660 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.transformed.expect
index f2d000e..1fb9971 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.expect
index 774152a..6bd9194 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A* = self::A*> extends core::Object {
+class B<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.outline.expect
index 2eff5be..ef0a99a 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A* = self::A*> extends core::Object {
+class B<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.transformed.expect
index 774152a..6bd9194 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A* = self::A*> extends core::Object {
+class B<T extends self::A*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.expect
index 545ce1b..ce1b438 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class M0<X extends core::Object* = dynamic, Y extends core::String* = core::String*> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.outline.expect
index 239c31f..d73c867 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class M0<X extends core::Object* = dynamic, Y extends core::String* = core::String*> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends 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_1.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.transformed.expect
index ad6db98..0ac49c5 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class M0<X extends core::Object* = dynamic, Y extends core::String* = core::String*> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.expect
index f7381da..4493630 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void = ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.outline.expect
index a94c66e..11c5048 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void = ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> 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_4.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.transformed.expect
index 5237b52..73fbc15 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void = ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     : super self::I::•()
     ;
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.expect
index 49660c2..2559222 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.expect
@@ -24,7 +24,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B* = self::B*>(self::f::T* a) → void {
+static method f<T extends self::B*>(self::f::T* a) → void {
   if(a is core::String*) {
     a.{self::B::foo}();
   }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.outline.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.outline.expect
index 208ac22..870ed64 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.outline.expect
@@ -22,7 +22,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B* = self::B*>(self::f::T* a) → void
+static method f<T extends self::B*>(self::f::T* a) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.transformed.expect
index 49660c2..2559222 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.transformed.expect
@@ -24,7 +24,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B* = self::B*>(self::f::T* a) → void {
+static method f<T extends self::B*>(self::f::T* a) → void {
   if(a is core::String*) {
     a.{self::B::foo}();
   }
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.expect
index fe7230d..c6c59b5 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.outline.expect
index 9075050..f6a0aba 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a;
   synthetic constructor •() → self::C<self::C::T*>*
     ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.transformed.expect
index 7f2b553..6560a3f 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.expect
index 3f1e661..729edd2 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.outline.expect
index e5feef6..5781f2e 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a;
   synthetic constructor •() → self::C<self::C::T*>*
     ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.transformed.expect
index 3f1e661..729edd2 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.expect
index 1af3200..fb481ea 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.outline.expect
index 48982ba..8b713df 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a;
   synthetic constructor •() → self::C<self::C::T*>*
     ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.transformed.expect
index 1af3200..fb481ea 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num* = core::num*> extends core::Object {
+class C<T extends core::num*> extends core::Object {
   generic-covariant-impl field self::C::T* a = null;
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.expect
index b96266f..336e446 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> 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* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.outline.expect
index 939b47e..dfe429a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> 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* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.transformed.expect
index b96266f..336e446 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> 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* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.expect
index 7089cfc..ff8c02f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.outline.expect
index 67dfa7f..4188002 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.transformed.expect
index c250022..e273fa4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.expect
index 3ab59eb..28c2e96 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.outline.expect
index 67dfa7f..4188002 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.transformed.expect
index 3ab59eb..28c2e96 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.expect
index 0508b6c..19c0496 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.outline.expect
index 66230d2..79e9ce6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends 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_list.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.transformed.expect
index 7f370d6..1c268dc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.expect
index 0b8c7d3..82bfe94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.outline.expect
index 66230d2..79e9ce6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends 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.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.transformed.expect
index 0b8c7d3..82bfe94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.expect
index c86f6b2..98dbd20 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.outline.expect
index d6d83e0..4906673 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.transformed.expect
index c86f6b2..98dbd20 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.expect
index 52cdb64..a7c105a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.outline.expect
index 84e4164..e263f73 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.transformed.expect
index a4aa8b0..92a4252 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.expect
index 0288d9a..5fa1f9e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+class D<X extends 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*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.outline.expect
index 4d48eae..24c0e8a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+class D<X extends 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*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.transformed.expect
index 0288d9a..5fa1f9e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+class D<X extends 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*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.expect
index f4627cb..6957306 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+class D<X extends 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*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.outline.expect
index fc7f600..8fc64c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+class D<X extends 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*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.transformed.expect
index 4c4e54a..e6f8f2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+class D<X extends 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*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.expect
index 1586c3d..e5f74ce 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.outline.expect
index 7d85a42..6f49703c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.transformed.expect
index 1586c3d..e5f74ce 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.expect
index edf4bbf..2cf489e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.outline.expect
index e2d5490..b8ba08d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.transformed.expect
index 71cc20d..a96c10c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.expect
index 033ea89..5da171e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.outline.expect
index ea7a309..408de03 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.transformed.expect
index 033ea89..5da171e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.expect
index 153ebe1..13d0abf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.outline.expect
index ea7a309..408de03 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.transformed.expect
index 153ebe1..13d0abf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.expect
index 8dbad85..f971b81 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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*> {
+class B<T extends core::num*, S extends core::List<self::B::T*>* = core::List<core::num*>*> extends self::A<self::B::T*> {
   constructor •([self::B::T* x = #C1]) → self::B<self::B::T*, self::B::S*>*
     : super self::A::•() {}
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.outline.expect
index e3cf9c5..933cc07 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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*> {
+class B<T extends 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_gives_input.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.transformed.expect
index 8dbad85..f971b81 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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*> {
+class B<T extends core::num*, S extends core::List<self::B::T*>* = core::List<core::num*>*> extends self::A<self::B::T*> {
   constructor •([self::B::T* x = #C1]) → self::B<self::B::T*, self::B::S*>*
     : super self::A::•() {}
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.expect
index b24b580..e04675b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.outline.expect
index 29045b9..2886fc8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.transformed.expect
index b24b580..e04675b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.expect
index 33fac9a..f1af679 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.outline.expect
index 2ea894b..ce6b446 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.transformed.expect
index 1468342..7b0f742 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.expect
index 90e4973..e2fc6ab 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.outline.expect
index f053bc2..64d45b2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.transformed.expect
index 90e4973..e2fc6ab 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.expect
index d8cb6c1..1576c98 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.expect
@@ -85,7 +85,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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 {
+class F<V extends 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*>*
     : super core::Object::•()
     ;
@@ -100,7 +100,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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 {
+class G<V extends 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*>*
     : super core::Object::•()
     ;
@@ -130,7 +130,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> 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*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.outline.expect
index df65afc..e29ceb1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.outline.expect
@@ -80,7 +80,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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 {
+class F<V extends 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*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -94,7 +94,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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 {
+class G<V extends 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*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> 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*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.transformed.expect
index d8cb6c1..1576c98 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.transformed.expect
@@ -85,7 +85,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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 {
+class F<V extends 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*>*
     : super core::Object::•()
     ;
@@ -100,7 +100,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-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 {
+class G<V extends 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*>*
     : super core::Object::•()
     ;
@@ -130,7 +130,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> 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*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.expect
index fc99ef9..c15ea34 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.expect
@@ -43,7 +43,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<TypeV extends self::B<dynamic>* = self::B<dynamic>*> extends core::Object {
+class C<TypeV extends self::B<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::TypeV*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.outline.expect
index ca37d02..b64816e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.outline.expect
@@ -41,7 +41,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<TypeV extends self::B<dynamic>* = self::B<dynamic>*> extends core::Object {
+class C<TypeV extends self::B<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::TypeV*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.transformed.expect
index fc99ef9..c15ea34 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.transformed.expect
@@ -43,7 +43,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<TypeV extends self::B<dynamic>* = self::B<dynamic>*> extends core::Object {
+class C<TypeV extends self::B<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::TypeV*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.expect
index 165ac5e..1adc8bcb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
-class Hest<TypeX extends () →* void = () →* void> extends core::Object {
+class Hest<TypeX extends () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.outline.expect
index c9e1d02..1828b6d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.outline.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
-class Hest<TypeX extends () →* void = () →* void> extends core::Object {
+class Hest<TypeX extends () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.transformed.expect
index 165ac5e..1adc8bcb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
-class Hest<TypeX extends () →* void = () →* void> extends core::Object {
+class Hest<TypeX extends () →* void> extends core::Object {
   synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.expect
index 134d69e..f205aa6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.outline.expect
index 5543106..8159df5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.transformed.expect
index 134d69e..f205aa6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.expect
index 132a9fd..0124e15 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.expect
@@ -42,7 +42,7 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic>* = self::Hest<dynamic>*> extends core::Object {
+class Hest<TypeY extends self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.outline.expect
index 573dcb4..e783ebd 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.outline.expect
@@ -42,7 +42,7 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic>* = self::Hest<dynamic>*> extends core::Object {
+class Hest<TypeY extends self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.transformed.expect
index 132a9fd..0124e15 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.transformed.expect
@@ -42,7 +42,7 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic>* = self::Hest<dynamic>*> extends core::Object {
+class Hest<TypeY extends self::Hest<dynamic>*> extends core::Object {
   synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.expect
index 570251f..34ba795 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.expect
@@ -43,7 +43,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic>* = self::Fisk<dynamic>*> extends core::Object {
+class Naebdyr<TypeZ extends self::Fisk<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.outline.expect
index e894bff..4c03b0d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.outline.expect
@@ -41,7 +41,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic>* = self::Fisk<dynamic>*> extends core::Object {
+class Naebdyr<TypeZ extends self::Fisk<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.transformed.expect
index 570251f..34ba795 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.transformed.expect
@@ -43,7 +43,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic>* = self::Fisk<dynamic>*> extends core::Object {
+class Naebdyr<TypeZ extends self::Fisk<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.expect
index 28149f2..97505bc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<core::num*>* = self::A<core::num*>*> extends core::Object {
+class B<T extends self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.outline.expect
index 3de42af..86a3170 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<core::num*>* = self::A<core::num*>*> extends core::Object {
+class B<T extends self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.transformed.expect
index 28149f2..97505bc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = core::num*> extends core::Object {
+class A<T extends core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<T extends self::A<core::num*>* = self::A<core::num*>*> extends core::Object {
+class B<T extends self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.expect
index 7253b00..5ec3988 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<Y extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+class B<Y extends self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.outline.expect
index 526b4dc..c896444 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<Y extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+class B<Y extends self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.transformed.expect
index 7253b00..5ec3988 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class B<Y extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+class B<Y extends self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::Y*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.expect
index 05e4575..fbb18cb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.expect
@@ -20,7 +20,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class X<T extends self::B* = self::B*> extends core::Object {
+class X<T extends self::B*> extends core::Object {
   synthetic constructor •() → self::X<self::X::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.outline.expect
index 9d44acf..43c0107 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.outline.expect
@@ -18,7 +18,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class X<T extends self::B* = self::B*> extends core::Object {
+class X<T extends self::B*> extends core::Object {
   synthetic constructor •() → self::X<self::X::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.transformed.expect
index 05e4575..fbb18cb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.transformed.expect
@@ -20,7 +20,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class X<T extends self::B* = self::B*> extends core::Object {
+class X<T extends self::B*> extends core::Object {
   synthetic constructor •() → self::X<self::X::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.expect
index 650f258..1e4c90a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.outline.expect
index c798857..bd8b1e2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.transformed.expect
index 650f258..1e4c90a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.expect
index e5555e7..954f38c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 static field core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.outline.expect
index e6917ea..88f9288 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 static field core::List<(core::num*) →* dynamic>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.transformed.expect
index 94f6c04..bf9f10e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 static field core::List<(core::num*) →* dynamic>* a = core::_GrowableList::•<(core::num*) →* dynamic>(0);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.expect
index 5412826..0914a2c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 static field core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.outline.expect
index 90306c1..9f56108 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 static field core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.transformed.expect
index 5412826..0914a2c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
 static field core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.expect
index f68319b..f32d1b22 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
-class B<T extends (core::num*) →* dynamic = (core::num*) →* dynamic> extends core::Object {
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.outline.expect
index c7b5f33..8f890d3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
-class B<T extends (core::num*) →* dynamic = (core::num*) →* dynamic> extends core::Object {
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.transformed.expect
index f68319b..f32d1b22 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<contravariant T extends core::num* = core::num*> = (T*) →* dynamic;
-class B<T extends (core::num*) →* dynamic = (core::num*) →* dynamic> extends core::Object {
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
index 184faaf..9e954be 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
@@ -42,7 +42,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class Class<T extends core::Object = core::Object> extends core::Object {
+class Class<T extends core::Object> extends core::Object {
   field core::int? _#Class#instanceField = null;
   field dynamic _#Class#finalInstanceField = null;
   field core::bool _#Class#finalInstanceField#isSet = false;
@@ -108,7 +108,7 @@
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
   }
-static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
+static method method<T extends core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
   lowered core::int? #local;
   function #local#get() → core::int
     return let final core::int? #t14 = #local in #t14.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t14{core::int};
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
index 184faaf..9e954be 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
@@ -42,7 +42,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class Class<T extends core::Object = core::Object> extends core::Object {
+class Class<T extends core::Object> extends core::Object {
   field core::int? _#Class#instanceField = null;
   field dynamic _#Class#finalInstanceField = null;
   field core::bool _#Class#finalInstanceField#isSet = false;
@@ -108,7 +108,7 @@
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
   }
-static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
+static method method<T extends core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
   lowered core::int? #local;
   function #local#get() → core::int
     return let final core::int? #t14 = #local in #t14.==(null) ?{core::int} throw new _in::LateError::localNI("local") : #t14{core::int};
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
index 7555788..f6a85c7 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
@@ -35,7 +35,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class Class<T extends core::Object = core::Object> extends core::Object {
+class Class<T extends core::Object> extends core::Object {
   field core::int? _#Class#instanceField = null;
   field core::bool _#Class#instanceField#isSet = false;
   field dynamic _#Class#finalInstanceField = null;
@@ -116,7 +116,7 @@
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
   }
-static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
+static method method<T extends core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
   lowered core::int? #local;
   lowered core::bool #local#isSet = false;
   function #local#get() → core::int
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.outline.expect
index c050791..1c5d975 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 import self as self2;
 import "dart:core" as core;
 
-class Class<T extends core::Object = core::Object> extends core::Object {
+class Class<T extends core::Object> extends core::Object {
   field core::int? _#Class#instanceField;
   field core::bool _#Class#instanceField#isSet;
   field dynamic _#Class#finalInstanceField;
@@ -46,7 +46,7 @@
 static set topLevelField(core::int #t7) → void;
 static get finalTopLevelField() → dynamic;
 static set finalTopLevelField(dynamic #t8) → void;
-static method method<T extends core::Object = core::Object>(core::bool b, core::int i, self2::method::T t) → dynamic
+static method method<T extends core::Object>(core::bool b, core::int i, self2::method::T t) → dynamic
   ;
 static method expect(dynamic expected, dynamic actual) → dynamic
   ;
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
index 7555788..f6a85c7 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class Class<T extends core::Object = core::Object> extends core::Object {
+class Class<T extends core::Object> extends core::Object {
   field core::int? _#Class#instanceField = null;
   field core::bool _#Class#instanceField#isSet = false;
   field dynamic _#Class#finalInstanceField = null;
@@ -116,7 +116,7 @@
     non::_#finalTopLevelField#isSet = true;
     non::_#finalTopLevelField = #t13;
   }
-static method method<T extends core::Object = core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
+static method method<T extends core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
   lowered core::int? #local;
   lowered core::bool #local#isSet = false;
   function #local#get() → core::int
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
index 5048e4b..19d474e 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.expect
@@ -981,7 +981,7 @@
     ;
   method call() → void {}
 }
-static method ok<XnonNull extends core::Object = core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
+static method ok<XnonNull extends core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
   dynamic dynamicVar = dynamicArg;
   dynamicVar = objectArg;
   dynamicVar = numArg;
@@ -1031,7 +1031,7 @@
   self::ok::YpotentiallyNull% yPotentiallyNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::YpotentiallyNull%;
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
-static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
+static method error<XnonNull extends core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
   core::Object objectVar = let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
index 1511c7e..0c62a44 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.strong.transformed.expect
@@ -981,7 +981,7 @@
     ;
   method call() → void {}
 }
-static method ok<XnonNull extends core::Object = core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
+static method ok<XnonNull extends core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
   dynamic dynamicVar = dynamicArg;
   dynamicVar = objectArg;
   dynamicVar = numArg;
@@ -1031,7 +1031,7 @@
   self::ok::YpotentiallyNull% yPotentiallyNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::YpotentiallyNull%;
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
-static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
+static method error<XnonNull extends core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
   core::Object objectVar = let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
index 5048e4b..19d474e 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
@@ -981,7 +981,7 @@
     ;
   method call() → void {}
 }
-static method ok<XnonNull extends core::Object = core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
+static method ok<XnonNull extends core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
   dynamic dynamicVar = dynamicArg;
   dynamicVar = objectArg;
   dynamicVar = numArg;
@@ -1031,7 +1031,7 @@
   self::ok::YpotentiallyNull% yPotentiallyNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::YpotentiallyNull%;
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
-static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
+static method error<XnonNull extends core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
   core::Object objectVar = let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.outline.expect
index 5697d0b..a3a89d2 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.outline.expect
@@ -8,9 +8,9 @@
   method call() → void
     ;
 }
-static method ok<XnonNull extends core::Object = core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic
+static method ok<XnonNull extends core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic
   ;
-static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic
+static method error<XnonNull extends core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
index 74dd324..24484a9 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
@@ -981,7 +981,7 @@
     ;
   method call() → void {}
 }
-static method ok<XnonNull extends core::Object = core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
+static method ok<XnonNull extends core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
   dynamic dynamicVar = dynamicArg;
   dynamicVar = objectArg;
   dynamicVar = numArg;
@@ -1031,7 +1031,7 @@
   self::ok::YpotentiallyNull% yPotentiallyNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::YpotentiallyNull%;
   yPotentiallyNullVar = yPotentiallyNullArg;
 }
-static method error<XnonNull extends core::Object = core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object? = core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
+static method error<XnonNull extends core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
   core::Object objectVar = let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
  - 'Object' is from 'dart:core'.
   Object objectVar = objectNullableArg;
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
index 90866e8..cf1774b 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
@@ -59,7 +59,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -69,7 +69,7 @@
     : super self::A::•()
     ;
 }
-class C<T extends self::A<core::num?> = self::A<core::num?>> extends core::Object {
+class C<T extends self::A<core::num?>> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
@@ -78,12 +78,12 @@
   synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
-  method hest<T extends core::num = core::num>() → void {}
+  method hest<T extends core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
 static method bar() → self::A<core::num?>? {}
-static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
-static method hest<T extends core::num = core::num>() → void {}
+static method baz<T extends self::A<core::num?>>() → dynamic {}
+static method hest<T extends core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
   self::hest<core::num?>();
   h.{self::Hest::hest}<core::num?>();
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
index 90866e8..cf1774b 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
@@ -59,7 +59,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -69,7 +69,7 @@
     : super self::A::•()
     ;
 }
-class C<T extends self::A<core::num?> = self::A<core::num?>> extends core::Object {
+class C<T extends self::A<core::num?>> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
@@ -78,12 +78,12 @@
   synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
-  method hest<T extends core::num = core::num>() → void {}
+  method hest<T extends core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
 static method bar() → self::A<core::num?>? {}
-static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
-static method hest<T extends core::num = core::num>() → void {}
+static method baz<T extends self::A<core::num?>>() → dynamic {}
+static method hest<T extends core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
   self::hest<core::num?>();
   h.{self::Hest::hest}<core::num?>();
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
index 90866e8..cf1774b 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
@@ -59,7 +59,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -69,7 +69,7 @@
     : super self::A::•()
     ;
 }
-class C<T extends self::A<core::num?> = self::A<core::num?>> extends core::Object {
+class C<T extends self::A<core::num?>> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
@@ -78,12 +78,12 @@
   synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
-  method hest<T extends core::num = core::num>() → void {}
+  method hest<T extends core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
 static method bar() → self::A<core::num?>? {}
-static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
-static method hest<T extends core::num = core::num>() → void {}
+static method baz<T extends self::A<core::num?>>() → dynamic {}
+static method hest<T extends core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
   self::hest<core::num?>();
   h.{self::Hest::hest}<core::num?>();
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect
index f3c9fb6..be5c01e 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect
@@ -45,7 +45,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     ;
 }
@@ -53,23 +53,23 @@
   synthetic constructor •() → self::B
     ;
 }
-class C<T extends self::A<core::num?> = self::A<core::num?>> extends core::Object {
+class C<T extends self::A<core::num?>> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     ;
 }
 class Hest extends core::Object {
   synthetic constructor •() → self::Hest
     ;
-  method hest<T extends core::num = core::num>() → void
+  method hest<T extends core::num>() → void
     ;
 }
 static method foo(self::A<core::num?> a) → dynamic
   ;
 static method bar() → self::A<core::num?>?
   ;
-static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic
+static method baz<T extends self::A<core::num?>>() → dynamic
   ;
-static method hest<T extends core::num = core::num>() → void
+static method hest<T extends core::num>() → void
   ;
 static method fisk(self::Hest h) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
index 90866e8..cf1774b 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
@@ -59,7 +59,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -69,7 +69,7 @@
     : super self::A::•()
     ;
 }
-class C<T extends self::A<core::num?> = self::A<core::num?>> extends core::Object {
+class C<T extends self::A<core::num?>> extends core::Object {
   synthetic constructor •() → self::C<self::C::T>
     : super core::Object::•()
     ;
@@ -78,12 +78,12 @@
   synthetic constructor •() → self::Hest
     : super core::Object::•()
     ;
-  method hest<T extends core::num = core::num>() → void {}
+  method hest<T extends core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
 static method bar() → self::A<core::num?>? {}
-static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
-static method hest<T extends core::num = core::num>() → void {}
+static method baz<T extends self::A<core::num?>>() → dynamic {}
+static method hest<T extends core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
   self::hest<core::num?>();
   h.{self::Hest::hest}<core::num?>();
diff --git a/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.expect b/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.expect
index c1de6b4..71679c9 100644
--- a/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object = core::Object> on T {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -14,7 +14,7 @@
   method method5 = self::Extension1|method5;
   tearoff method5 = self::Extension1|get#method5;
 }
-extension Extension2<T extends core::String = core::String> on T {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -26,7 +26,7 @@
   method method5 = self::Extension2|method5;
   tearoff method5 = self::Extension2|get#method5;
 }
-extension Extension3<T extends dynamic = dynamic> on T% {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -50,7 +50,7 @@
   method method5 = self::Extension4|method5;
   tearoff method5 = self::Extension4|get#method5;
 }
-extension Extension5<T extends core::Object? = core::Object?> on T% {
+extension Extension5<T extends core::Object?> on T% {
   method method1 = self::Extension5|method1;
   tearoff method1 = self::Extension5|get#method1;
   method method2 = self::Extension5|method2;
@@ -62,79 +62,79 @@
   method method5 = self::Extension5|method5;
   tearoff method5 = self::Extension5|get#method5;
 }
-static method Extension1|method1<T extends core::Object = core::Object, S extends core::Object = core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object = core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
-static method Extension1|method2<T extends core::Object = core::Object, S extends core::String = core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object = core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
-static method Extension1|method3<T extends core::Object = core::Object, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object = core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
-static method Extension1|method4<T extends core::Object = core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object = core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
-static method Extension1|method5<T extends core::Object = core::Object, S extends core::Object? = core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
-static method Extension1|get#method5<T extends core::Object = core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
-static method Extension2|method1<T extends core::String = core::String, S extends core::Object = core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String = core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
-static method Extension2|method2<T extends core::String = core::String, S extends core::String = core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String = core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
-static method Extension2|method3<T extends core::String = core::String, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String = core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
-static method Extension2|get#method4<T extends core::String = core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method5<T extends core::Object, S extends core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
+static method Extension1|get#method5<T extends core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
-static method Extension2|method4<T extends core::String = core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
-static method Extension2|method5<T extends core::String = core::String, S extends core::Object? = core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
-static method Extension2|get#method5<T extends core::String = core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object = core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String = core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|method5<T extends core::String, S extends core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
+static method Extension2|get#method5<T extends core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
-static method Extension3|method5<T extends dynamic = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
-static method Extension3|get#method5<T extends dynamic = dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
-static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object = core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
-static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String = core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
-static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension3|method5<T extends dynamic, S extends core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
+static method Extension3|get#method5<T extends dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
 static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
 static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
-static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
-static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
-static method Extension5|method1<T extends core::Object? = core::Object?, S extends core::Object = core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
-static method Extension5|get#method1<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
-static method Extension5|method2<T extends core::Object? = core::Object?, S extends core::String = core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
-static method Extension5|get#method2<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
-static method Extension5|method3<T extends core::Object? = core::Object?, S extends dynamic = dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
-static method Extension5|get#method3<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
-static method Extension5|method4<T extends core::Object? = core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
-static method Extension5|get#method4<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
+static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
+static method Extension5|method1<T extends core::Object?, S extends core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
+static method Extension5|get#method1<T extends core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
+static method Extension5|method2<T extends core::Object?, S extends core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
+static method Extension5|get#method2<T extends core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
+static method Extension5|method3<T extends core::Object?, S extends dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
+static method Extension5|get#method3<T extends core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
+static method Extension5|method4<T extends core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
+static method Extension5|get#method4<T extends core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension5|method4<self::Extension5|get#method4::T%, S%>(#this);
-static method Extension5|method5<T extends core::Object? = core::Object?, S extends core::Object? = core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
-static method Extension5|get#method5<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
+static method Extension5|method5<T extends core::Object?, S extends core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
+static method Extension5|get#method5<T extends core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.transformed.expect
index c1de6b4..71679c9 100644
--- a/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_bounds.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object = core::Object> on T {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -14,7 +14,7 @@
   method method5 = self::Extension1|method5;
   tearoff method5 = self::Extension1|get#method5;
 }
-extension Extension2<T extends core::String = core::String> on T {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -26,7 +26,7 @@
   method method5 = self::Extension2|method5;
   tearoff method5 = self::Extension2|get#method5;
 }
-extension Extension3<T extends dynamic = dynamic> on T% {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -50,7 +50,7 @@
   method method5 = self::Extension4|method5;
   tearoff method5 = self::Extension4|get#method5;
 }
-extension Extension5<T extends core::Object? = core::Object?> on T% {
+extension Extension5<T extends core::Object?> on T% {
   method method1 = self::Extension5|method1;
   tearoff method1 = self::Extension5|get#method1;
   method method2 = self::Extension5|method2;
@@ -62,79 +62,79 @@
   method method5 = self::Extension5|method5;
   tearoff method5 = self::Extension5|get#method5;
 }
-static method Extension1|method1<T extends core::Object = core::Object, S extends core::Object = core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object = core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
-static method Extension1|method2<T extends core::Object = core::Object, S extends core::String = core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object = core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
-static method Extension1|method3<T extends core::Object = core::Object, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object = core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
-static method Extension1|method4<T extends core::Object = core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object = core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
-static method Extension1|method5<T extends core::Object = core::Object, S extends core::Object? = core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
-static method Extension1|get#method5<T extends core::Object = core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
-static method Extension2|method1<T extends core::String = core::String, S extends core::Object = core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String = core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
-static method Extension2|method2<T extends core::String = core::String, S extends core::String = core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String = core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
-static method Extension2|method3<T extends core::String = core::String, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String = core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
-static method Extension2|get#method4<T extends core::String = core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method5<T extends core::Object, S extends core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
+static method Extension1|get#method5<T extends core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
-static method Extension2|method4<T extends core::String = core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
-static method Extension2|method5<T extends core::String = core::String, S extends core::Object? = core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
-static method Extension2|get#method5<T extends core::String = core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object = core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String = core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|method5<T extends core::String, S extends core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
+static method Extension2|get#method5<T extends core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
-static method Extension3|method5<T extends dynamic = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
-static method Extension3|get#method5<T extends dynamic = dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
-static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object = core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
-static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String = core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
-static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension3|method5<T extends dynamic, S extends core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
+static method Extension3|get#method5<T extends dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
 static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
 static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
-static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
-static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
-static method Extension5|method1<T extends core::Object? = core::Object?, S extends core::Object = core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
-static method Extension5|get#method1<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
-static method Extension5|method2<T extends core::Object? = core::Object?, S extends core::String = core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
-static method Extension5|get#method2<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
-static method Extension5|method3<T extends core::Object? = core::Object?, S extends dynamic = dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
-static method Extension5|get#method3<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
-static method Extension5|method4<T extends core::Object? = core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
-static method Extension5|get#method4<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
+static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
+static method Extension5|method1<T extends core::Object?, S extends core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
+static method Extension5|get#method1<T extends core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
+static method Extension5|method2<T extends core::Object?, S extends core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
+static method Extension5|get#method2<T extends core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
+static method Extension5|method3<T extends core::Object?, S extends dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
+static method Extension5|get#method3<T extends core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
+static method Extension5|method4<T extends core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
+static method Extension5|get#method4<T extends core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension5|method4<self::Extension5|get#method4::T%, S%>(#this);
-static method Extension5|method5<T extends core::Object? = core::Object?, S extends core::Object? = core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
-static method Extension5|get#method5<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
+static method Extension5|method5<T extends core::Object?, S extends core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
+static method Extension5|get#method5<T extends core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.expect b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.expect
index c1de6b4..71679c9 100644
--- a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object = core::Object> on T {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -14,7 +14,7 @@
   method method5 = self::Extension1|method5;
   tearoff method5 = self::Extension1|get#method5;
 }
-extension Extension2<T extends core::String = core::String> on T {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -26,7 +26,7 @@
   method method5 = self::Extension2|method5;
   tearoff method5 = self::Extension2|get#method5;
 }
-extension Extension3<T extends dynamic = dynamic> on T% {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -50,7 +50,7 @@
   method method5 = self::Extension4|method5;
   tearoff method5 = self::Extension4|get#method5;
 }
-extension Extension5<T extends core::Object? = core::Object?> on T% {
+extension Extension5<T extends core::Object?> on T% {
   method method1 = self::Extension5|method1;
   tearoff method1 = self::Extension5|get#method1;
   method method2 = self::Extension5|method2;
@@ -62,79 +62,79 @@
   method method5 = self::Extension5|method5;
   tearoff method5 = self::Extension5|get#method5;
 }
-static method Extension1|method1<T extends core::Object = core::Object, S extends core::Object = core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object = core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
-static method Extension1|method2<T extends core::Object = core::Object, S extends core::String = core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object = core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
-static method Extension1|method3<T extends core::Object = core::Object, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object = core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
-static method Extension1|method4<T extends core::Object = core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object = core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
-static method Extension1|method5<T extends core::Object = core::Object, S extends core::Object? = core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
-static method Extension1|get#method5<T extends core::Object = core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
-static method Extension2|method1<T extends core::String = core::String, S extends core::Object = core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String = core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
-static method Extension2|method2<T extends core::String = core::String, S extends core::String = core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String = core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
-static method Extension2|method3<T extends core::String = core::String, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String = core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
-static method Extension2|get#method4<T extends core::String = core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method5<T extends core::Object, S extends core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
+static method Extension1|get#method5<T extends core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
-static method Extension2|method4<T extends core::String = core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
-static method Extension2|method5<T extends core::String = core::String, S extends core::Object? = core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
-static method Extension2|get#method5<T extends core::String = core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object = core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String = core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|method5<T extends core::String, S extends core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
+static method Extension2|get#method5<T extends core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
-static method Extension3|method5<T extends dynamic = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
-static method Extension3|get#method5<T extends dynamic = dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
-static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object = core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
-static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String = core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
-static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension3|method5<T extends dynamic, S extends core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
+static method Extension3|get#method5<T extends dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
 static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
 static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
-static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
-static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
-static method Extension5|method1<T extends core::Object? = core::Object?, S extends core::Object = core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
-static method Extension5|get#method1<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
-static method Extension5|method2<T extends core::Object? = core::Object?, S extends core::String = core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
-static method Extension5|get#method2<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
-static method Extension5|method3<T extends core::Object? = core::Object?, S extends dynamic = dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
-static method Extension5|get#method3<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
-static method Extension5|method4<T extends core::Object? = core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
-static method Extension5|get#method4<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
+static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
+static method Extension5|method1<T extends core::Object?, S extends core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
+static method Extension5|get#method1<T extends core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
+static method Extension5|method2<T extends core::Object?, S extends core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
+static method Extension5|get#method2<T extends core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
+static method Extension5|method3<T extends core::Object?, S extends dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
+static method Extension5|get#method3<T extends core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
+static method Extension5|method4<T extends core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
+static method Extension5|get#method4<T extends core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension5|method4<self::Extension5|get#method4::T%, S%>(#this);
-static method Extension5|method5<T extends core::Object? = core::Object?, S extends core::Object? = core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
-static method Extension5|get#method5<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
+static method Extension5|method5<T extends core::Object?, S extends core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
+static method Extension5|get#method5<T extends core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.outline.expect
index 6cec804..848fec8 100644
--- a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object = core::Object> on T {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -14,7 +14,7 @@
   method method5 = self::Extension1|method5;
   tearoff method5 = self::Extension1|get#method5;
 }
-extension Extension2<T extends core::String = core::String> on T {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -26,7 +26,7 @@
   method method5 = self::Extension2|method5;
   tearoff method5 = self::Extension2|get#method5;
 }
-extension Extension3<T extends dynamic = dynamic> on T% {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -50,7 +50,7 @@
   method method5 = self::Extension4|method5;
   tearoff method5 = self::Extension4|get#method5;
 }
-extension Extension5<T extends core::Object? = core::Object?> on T% {
+extension Extension5<T extends core::Object?> on T% {
   method method1 = self::Extension5|method1;
   tearoff method1 = self::Extension5|get#method1;
   method method2 = self::Extension5|method2;
@@ -62,105 +62,105 @@
   method method5 = self::Extension5|method5;
   tearoff method5 = self::Extension5|get#method5;
 }
-static method Extension1|method1<T extends core::Object = core::Object, S extends core::Object = core::Object>(lowered final self::Extension1|method1::T #this) → dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic
   ;
-static method Extension1|get#method1<T extends core::Object = core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
-static method Extension1|method2<T extends core::Object = core::Object, S extends core::String = core::String>(lowered final self::Extension1|method2::T #this) → dynamic
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic
   ;
-static method Extension1|get#method2<T extends core::Object = core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
-static method Extension1|method3<T extends core::Object = core::Object, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T #this) → dynamic
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic
   ;
-static method Extension1|get#method3<T extends core::Object = core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
-static method Extension1|method4<T extends core::Object = core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic
   ;
-static method Extension1|get#method4<T extends core::Object = core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
-static method Extension1|method5<T extends core::Object = core::Object, S extends core::Object? = core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic
+static method Extension1|method5<T extends core::Object, S extends core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic
   ;
-static method Extension1|get#method5<T extends core::Object = core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
-static method Extension2|method1<T extends core::String = core::String, S extends core::Object = core::Object>(lowered final self::Extension2|method1::T #this) → dynamic
+static method Extension1|get#method5<T extends core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic
   ;
-static method Extension2|get#method1<T extends core::String = core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
-static method Extension2|method2<T extends core::String = core::String, S extends core::String = core::String>(lowered final self::Extension2|method2::T #this) → dynamic
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic
   ;
-static method Extension2|get#method2<T extends core::String = core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
-static method Extension2|method3<T extends core::String = core::String, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T #this) → dynamic
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic
   ;
-static method Extension2|get#method3<T extends core::String = core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
-static method Extension2|get#method4<T extends core::String = core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
-static method Extension2|method4<T extends core::String = core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic
   ;
-static method Extension2|method5<T extends core::String = core::String, S extends core::Object? = core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic
+static method Extension2|method5<T extends core::String, S extends core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic
   ;
-static method Extension2|get#method5<T extends core::String = core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object = core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic
+static method Extension2|get#method5<T extends core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic
   ;
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String = core::String>(lowered final self::Extension3|method2::T% #this) → dynamic
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic
   ;
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic
   ;
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic
   ;
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
-static method Extension3|method5<T extends dynamic = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic
+static method Extension3|method5<T extends dynamic, S extends core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic
   ;
-static method Extension3|get#method5<T extends dynamic = dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
-static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object = core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic
+static method Extension3|get#method5<T extends dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic
   ;
-static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
-static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String = core::String>(lowered final self::Extension4|method2::T% #this) → dynamic
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic
   ;
-static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
-static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic
   ;
-static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
 static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic
   ;
 static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
-static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic
+static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic
   ;
-static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
-static method Extension5|method1<T extends core::Object? = core::Object?, S extends core::Object = core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic
+static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
+static method Extension5|method1<T extends core::Object?, S extends core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic
   ;
-static method Extension5|get#method1<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
-static method Extension5|method2<T extends core::Object? = core::Object?, S extends core::String = core::String>(lowered final self::Extension5|method2::T% #this) → dynamic
+static method Extension5|get#method1<T extends core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
+static method Extension5|method2<T extends core::Object?, S extends core::String>(lowered final self::Extension5|method2::T% #this) → dynamic
   ;
-static method Extension5|get#method2<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
-static method Extension5|method3<T extends core::Object? = core::Object?, S extends dynamic = dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic
+static method Extension5|get#method2<T extends core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
+static method Extension5|method3<T extends core::Object?, S extends dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic
   ;
-static method Extension5|get#method3<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
-static method Extension5|method4<T extends core::Object? = core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic
+static method Extension5|get#method3<T extends core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
+static method Extension5|method4<T extends core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic
   ;
-static method Extension5|get#method4<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension5|get#method4<T extends core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension5|method4<self::Extension5|get#method4::T%, S%>(#this);
-static method Extension5|method5<T extends core::Object? = core::Object?, S extends core::Object? = core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic
+static method Extension5|method5<T extends core::Object?, S extends core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic
   ;
-static method Extension5|get#method5<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
+static method Extension5|get#method5<T extends core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.transformed.expect
index c1de6b4..71679c9 100644
--- a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-extension Extension1<T extends core::Object = core::Object> on T {
+extension Extension1<T extends core::Object> on T {
   method method1 = self::Extension1|method1;
   tearoff method1 = self::Extension1|get#method1;
   method method2 = self::Extension1|method2;
@@ -14,7 +14,7 @@
   method method5 = self::Extension1|method5;
   tearoff method5 = self::Extension1|get#method5;
 }
-extension Extension2<T extends core::String = core::String> on T {
+extension Extension2<T extends core::String> on T {
   method method1 = self::Extension2|method1;
   tearoff method1 = self::Extension2|get#method1;
   method method2 = self::Extension2|method2;
@@ -26,7 +26,7 @@
   method method5 = self::Extension2|method5;
   tearoff method5 = self::Extension2|get#method5;
 }
-extension Extension3<T extends dynamic = dynamic> on T% {
+extension Extension3<T extends dynamic> on T% {
   method method1 = self::Extension3|method1;
   tearoff method1 = self::Extension3|get#method1;
   method method2 = self::Extension3|method2;
@@ -50,7 +50,7 @@
   method method5 = self::Extension4|method5;
   tearoff method5 = self::Extension4|get#method5;
 }
-extension Extension5<T extends core::Object? = core::Object?> on T% {
+extension Extension5<T extends core::Object?> on T% {
   method method1 = self::Extension5|method1;
   tearoff method1 = self::Extension5|get#method1;
   method method2 = self::Extension5|method2;
@@ -62,79 +62,79 @@
   method method5 = self::Extension5|method5;
   tearoff method5 = self::Extension5|get#method5;
 }
-static method Extension1|method1<T extends core::Object = core::Object, S extends core::Object = core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
-static method Extension1|get#method1<T extends core::Object = core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
-static method Extension1|method2<T extends core::Object = core::Object, S extends core::String = core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
-static method Extension1|get#method2<T extends core::Object = core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
-static method Extension1|method3<T extends core::Object = core::Object, S extends dynamic = dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
-static method Extension1|get#method3<T extends core::Object = core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
-static method Extension1|method4<T extends core::Object = core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
-static method Extension1|get#method4<T extends core::Object = core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
-static method Extension1|method5<T extends core::Object = core::Object, S extends core::Object? = core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
-static method Extension1|get#method5<T extends core::Object = core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
-static method Extension2|method1<T extends core::String = core::String, S extends core::Object = core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
-static method Extension2|get#method1<T extends core::String = core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
-static method Extension2|method2<T extends core::String = core::String, S extends core::String = core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
-static method Extension2|get#method2<T extends core::String = core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
-static method Extension2|method3<T extends core::String = core::String, S extends dynamic = dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
-static method Extension2|get#method3<T extends core::String = core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
-static method Extension2|get#method4<T extends core::String = core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension1|method5<T extends core::Object, S extends core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
+static method Extension1|get#method5<T extends core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
-static method Extension2|method4<T extends core::String = core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
-static method Extension2|method5<T extends core::String = core::String, S extends core::Object? = core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
-static method Extension2|get#method5<T extends core::String = core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
-static method Extension3|method1<T extends dynamic = dynamic, S extends core::Object = core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
-static method Extension3|get#method1<T extends dynamic = dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
-static method Extension3|method2<T extends dynamic = dynamic, S extends core::String = core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
-static method Extension3|get#method2<T extends dynamic = dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
-static method Extension3|method3<T extends dynamic = dynamic, S extends dynamic = dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
-static method Extension3|get#method3<T extends dynamic = dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
-static method Extension3|method4<T extends dynamic = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
-static method Extension3|get#method4<T extends dynamic = dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|method5<T extends core::String, S extends core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
+static method Extension2|get#method5<T extends core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
-static method Extension3|method5<T extends dynamic = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
-static method Extension3|get#method5<T extends dynamic = dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
-static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object = core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
-static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
-static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String = core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
-static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
-static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic = dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
-static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension3|method5<T extends dynamic, S extends core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
+static method Extension3|get#method5<T extends dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
 static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
 static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
-static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object? = core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
-static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
-static method Extension5|method1<T extends core::Object? = core::Object?, S extends core::Object = core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
-static method Extension5|get#method1<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object = core::Object>() → dynamic
-  return <S extends core::Object = core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
-static method Extension5|method2<T extends core::Object? = core::Object?, S extends core::String = core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
-static method Extension5|get#method2<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String = core::String>() → dynamic
-  return <S extends core::String = core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
-static method Extension5|method3<T extends core::Object? = core::Object?, S extends dynamic = dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
-static method Extension5|get#method3<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic = dynamic>() → dynamic
-  return <S extends dynamic = dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
-static method Extension5|method4<T extends core::Object? = core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
-static method Extension5|get#method4<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
+static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
+static method Extension5|method1<T extends core::Object?, S extends core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
+static method Extension5|get#method1<T extends core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
+static method Extension5|method2<T extends core::Object?, S extends core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
+static method Extension5|get#method2<T extends core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
+static method Extension5|method3<T extends core::Object?, S extends dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
+static method Extension5|get#method3<T extends core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
+static method Extension5|method4<T extends core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
+static method Extension5|get#method4<T extends core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
   return <S extends core::Object? = dynamic>() → dynamic => self::Extension5|method4<self::Extension5|get#method4::T%, S%>(#this);
-static method Extension5|method5<T extends core::Object? = core::Object?, S extends core::Object? = core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
-static method Extension5|get#method5<T extends core::Object? = core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object? = core::Object?>() → dynamic
-  return <S extends core::Object? = core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
+static method Extension5|method5<T extends core::Object?, S extends core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
+static method Extension5|get#method5<T extends core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
index b4f5d7a..9eabe2c 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
@@ -35,7 +35,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class = self::Class> on T {
+extension BoundExtension<T extends self::Class> on T {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -43,9 +43,9 @@
   return #this;
 static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
   return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
-static method BoundExtension|method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
   return #this;
-static method BoundExtension|get#method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
   return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
 static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
   if(t1 is{ForNonNullableByDefault} self::SubClass) {
@@ -56,7 +56,7 @@
   }
   return new self::Class::•();
 }
-static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
   if(self::test2::T.{core::Type::==}(#C1)) {
     self::SubClass subClass = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
index 19b39bd..3d46c4f 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class = self::Class> on T {
+extension BoundExtension<T extends self::Class> on T {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -43,9 +43,9 @@
   return #this;
 static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
   return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
-static method BoundExtension|method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
   return #this;
-static method BoundExtension|get#method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
   return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
 static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
   if(t1 is{ForNonNullableByDefault} self::SubClass) {
@@ -56,7 +56,7 @@
   }
   return new self::Class::•();
 }
-static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
   if(self::test2::T.{core::Type::==}(#C1)) {
     self::SubClass subClass = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
index 826d688..b1bfc74 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
@@ -35,7 +35,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class = self::Class> on T {
+extension BoundExtension<T extends self::Class> on T {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -43,9 +43,9 @@
   return #this;
 static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
   return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
-static method BoundExtension|method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
   return #this;
-static method BoundExtension|get#method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
   return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
 static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
   if(t1 is{ForNonNullableByDefault} self::SubClass) {
@@ -56,7 +56,7 @@
   }
   return new self::Class::•();
 }
-static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
   if(self::test2::T.{core::Type::==}(#C1)) {
     self::SubClass subClass = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.outline.expect
index 7798a93..1a7ba19 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.outline.expect
@@ -14,7 +14,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class = self::Class> on T {
+extension BoundExtension<T extends self::Class> on T {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -22,13 +22,13 @@
   ;
 static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
   return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
-static method BoundExtension|method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
   ;
-static method BoundExtension|get#method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
   return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
 static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class
   ;
-static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic
   ;
 static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
index fb35bc5..ae9d534 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
   method method1 = self::Extension|method1;
   tearoff method1 = self::Extension|get#method1;
 }
-extension BoundExtension<T extends self::Class = self::Class> on T {
+extension BoundExtension<T extends self::Class> on T {
   method method2 = self::BoundExtension|method2;
   tearoff method2 = self::BoundExtension|get#method2;
 }
@@ -43,9 +43,9 @@
   return #this;
 static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
   return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
-static method BoundExtension|method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
   return #this;
-static method BoundExtension|get#method2<T extends self::Class = self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
   return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
 static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
   if(t1 is{ForNonNullableByDefault} self::SubClass) {
@@ -56,7 +56,7 @@
   }
   return new self::Class::•();
 }
-static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
   if(self::test2::T.{core::Type::==}(#C1)) {
     self::SubClass subClass = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
index 70b4d24..37f68ac 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.expect
@@ -212,7 +212,7 @@
     : super core::Object::•()
     ;
 }
-extension Extension<T extends core::num = core::num> on core::int {
+extension Extension<T extends core::num> on core::int {
   get property1 = self::Extension|get#property1;
   get property2 = self::Extension|get#property2;
   get property3 = self::Extension|get#property3;
@@ -243,35 +243,35 @@
 static get property3() → core::int?
   return 0;
 static set property3(core::int value) → void {}
-static method Extension|get#property1<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|get#property1<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property1<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property2<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|set#property1<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property2<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property2<T extends core::num = core::num>(lowered final core::int #this, core::int? i) → void {}
-static method Extension|get#property3<T extends core::num = core::num>(lowered final core::int #this) → core::int?
+static method Extension|set#property2<T extends core::num>(lowered final core::int #this, core::int? i) → void {}
+static method Extension|get#property3<T extends core::num>(lowered final core::int #this) → core::int?
   return 0;
-static method Extension|set#property3<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property4a<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
+static method Extension|set#property3<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property4a<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
   return let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:134:23: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property4a => 0; // ok
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4a<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
-static method Extension|get#property4b<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
+static method Extension|set#property4a<T extends core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
+static method Extension|get#property4b<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
   return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:137:24: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property4b => 0; // ok
                        ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4b<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
-static method Extension|get#property5<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property5::T
+static method Extension|set#property4b<T extends core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
+static method Extension|get#property5<T extends core::num>(lowered final core::int #this) → self::Extension|get#property5::T
   return let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:140:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property5 => 0; // ok
                      ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property5<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
-static method Extension|get#property6<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
+static method Extension|set#property5<T extends core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
+static method Extension|get#property6<T extends core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
   return let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:23: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property6 => 0; // error
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property6<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
+static method Extension|set#property6<T extends core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
 static get Extension|property7() → core::int
   return 0;
 static set Extension|property7(core::int value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
index 70b4d24..37f68ac 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.strong.transformed.expect
@@ -212,7 +212,7 @@
     : super core::Object::•()
     ;
 }
-extension Extension<T extends core::num = core::num> on core::int {
+extension Extension<T extends core::num> on core::int {
   get property1 = self::Extension|get#property1;
   get property2 = self::Extension|get#property2;
   get property3 = self::Extension|get#property3;
@@ -243,35 +243,35 @@
 static get property3() → core::int?
   return 0;
 static set property3(core::int value) → void {}
-static method Extension|get#property1<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|get#property1<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property1<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property2<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|set#property1<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property2<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property2<T extends core::num = core::num>(lowered final core::int #this, core::int? i) → void {}
-static method Extension|get#property3<T extends core::num = core::num>(lowered final core::int #this) → core::int?
+static method Extension|set#property2<T extends core::num>(lowered final core::int #this, core::int? i) → void {}
+static method Extension|get#property3<T extends core::num>(lowered final core::int #this) → core::int?
   return 0;
-static method Extension|set#property3<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property4a<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
+static method Extension|set#property3<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property4a<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
   return let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:134:23: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property4a => 0; // ok
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4a<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
-static method Extension|get#property4b<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
+static method Extension|set#property4a<T extends core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
+static method Extension|get#property4b<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
   return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:137:24: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property4b => 0; // ok
                        ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4b<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
-static method Extension|get#property5<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property5::T
+static method Extension|set#property4b<T extends core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
+static method Extension|get#property5<T extends core::num>(lowered final core::int #this) → self::Extension|get#property5::T
   return let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:140:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property5 => 0; // ok
                      ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property5<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
-static method Extension|get#property6<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
+static method Extension|set#property5<T extends core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
+static method Extension|get#property6<T extends core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
   return let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:23: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property6 => 0; // error
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property6<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
+static method Extension|set#property6<T extends core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
 static get Extension|property7() → core::int
   return 0;
 static set Extension|property7(core::int value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
index 70b4d24..37f68ac 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.expect
@@ -212,7 +212,7 @@
     : super core::Object::•()
     ;
 }
-extension Extension<T extends core::num = core::num> on core::int {
+extension Extension<T extends core::num> on core::int {
   get property1 = self::Extension|get#property1;
   get property2 = self::Extension|get#property2;
   get property3 = self::Extension|get#property3;
@@ -243,35 +243,35 @@
 static get property3() → core::int?
   return 0;
 static set property3(core::int value) → void {}
-static method Extension|get#property1<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|get#property1<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property1<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property2<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|set#property1<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property2<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property2<T extends core::num = core::num>(lowered final core::int #this, core::int? i) → void {}
-static method Extension|get#property3<T extends core::num = core::num>(lowered final core::int #this) → core::int?
+static method Extension|set#property2<T extends core::num>(lowered final core::int #this, core::int? i) → void {}
+static method Extension|get#property3<T extends core::num>(lowered final core::int #this) → core::int?
   return 0;
-static method Extension|set#property3<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property4a<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
+static method Extension|set#property3<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property4a<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
   return let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:134:23: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property4a => 0; // ok
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4a<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
-static method Extension|get#property4b<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
+static method Extension|set#property4a<T extends core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
+static method Extension|get#property4b<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
   return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:137:24: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property4b => 0; // ok
                        ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4b<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
-static method Extension|get#property5<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property5::T
+static method Extension|set#property4b<T extends core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
+static method Extension|get#property5<T extends core::num>(lowered final core::int #this) → self::Extension|get#property5::T
   return let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:140:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property5 => 0; // ok
                      ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property5<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
-static method Extension|get#property6<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
+static method Extension|set#property5<T extends core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
+static method Extension|get#property6<T extends core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
   return let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:23: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property6 => 0; // error
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property6<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
+static method Extension|set#property6<T extends core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
 static get Extension|property7() → core::int
   return 0;
 static set Extension|property7(core::int value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.outline.expect
index 73e689a..adb8072 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.outline.expect
@@ -190,7 +190,7 @@
   synthetic constructor •() → self::D4
     ;
 }
-extension Extension<T extends core::num = core::num> on core::int {
+extension Extension<T extends core::num> on core::int {
   get property1 = self::Extension|get#property1;
   get property2 = self::Extension|get#property2;
   get property3 = self::Extension|get#property3;
@@ -224,33 +224,33 @@
   ;
 static set property3(core::int value) → void
   ;
-static method Extension|get#property1<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|get#property1<T extends core::num>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#property1<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void
+static method Extension|set#property1<T extends core::num>(lowered final core::int #this, core::int i) → void
   ;
-static method Extension|get#property2<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|get#property2<T extends core::num>(lowered final core::int #this) → core::int
   ;
-static method Extension|set#property2<T extends core::num = core::num>(lowered final core::int #this, core::int? i) → void
+static method Extension|set#property2<T extends core::num>(lowered final core::int #this, core::int? i) → void
   ;
-static method Extension|get#property3<T extends core::num = core::num>(lowered final core::int #this) → core::int?
+static method Extension|get#property3<T extends core::num>(lowered final core::int #this) → core::int?
   ;
-static method Extension|set#property3<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void
+static method Extension|set#property3<T extends core::num>(lowered final core::int #this, core::int i) → void
   ;
-static method Extension|get#property4a<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
+static method Extension|get#property4a<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
   ;
-static method Extension|set#property4a<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void
+static method Extension|set#property4a<T extends core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void
   ;
-static method Extension|get#property4b<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
+static method Extension|get#property4b<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
   ;
-static method Extension|set#property4b<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void
+static method Extension|set#property4b<T extends core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void
   ;
-static method Extension|get#property5<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property5::T
+static method Extension|get#property5<T extends core::num>(lowered final core::int #this) → self::Extension|get#property5::T
   ;
-static method Extension|set#property5<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void
+static method Extension|set#property5<T extends core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void
   ;
-static method Extension|get#property6<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
+static method Extension|get#property6<T extends core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
   ;
-static method Extension|set#property6<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void
+static method Extension|set#property6<T extends core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void
   ;
 static get Extension|property7() → core::int
   ;
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
index 70b4d24..37f68ac 100644
--- a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.transformed.expect
@@ -212,7 +212,7 @@
     : super core::Object::•()
     ;
 }
-extension Extension<T extends core::num = core::num> on core::int {
+extension Extension<T extends core::num> on core::int {
   get property1 = self::Extension|get#property1;
   get property2 = self::Extension|get#property2;
   get property3 = self::Extension|get#property3;
@@ -243,35 +243,35 @@
 static get property3() → core::int?
   return 0;
 static set property3(core::int value) → void {}
-static method Extension|get#property1<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|get#property1<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property1<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property2<T extends core::num = core::num>(lowered final core::int #this) → core::int
+static method Extension|set#property1<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property2<T extends core::num>(lowered final core::int #this) → core::int
   return 0;
-static method Extension|set#property2<T extends core::num = core::num>(lowered final core::int #this, core::int? i) → void {}
-static method Extension|get#property3<T extends core::num = core::num>(lowered final core::int #this) → core::int?
+static method Extension|set#property2<T extends core::num>(lowered final core::int #this, core::int? i) → void {}
+static method Extension|get#property3<T extends core::num>(lowered final core::int #this) → core::int?
   return 0;
-static method Extension|set#property3<T extends core::num = core::num>(lowered final core::int #this, core::int i) → void {}
-static method Extension|get#property4a<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
+static method Extension|set#property3<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property4a<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
   return let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:134:23: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property4a => 0; // ok
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4a<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
-static method Extension|get#property4b<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
+static method Extension|set#property4a<T extends core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
+static method Extension|get#property4b<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
   return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:137:24: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property4b => 0; // ok
                        ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property4b<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
-static method Extension|get#property5<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property5::T
+static method Extension|set#property4b<T extends core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
+static method Extension|get#property5<T extends core::num>(lowered final core::int #this) → self::Extension|get#property5::T
   return let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:140:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
   T get property5 => 0; // ok
                      ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property5<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
-static method Extension|get#property6<T extends core::num = core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
+static method Extension|set#property5<T extends core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
+static method Extension|get#property6<T extends core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
   return let final Never #t4 = invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:23: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
   T? get property6 => 0; // error
                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
-static method Extension|set#property6<T extends core::num = core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
+static method Extension|set#property6<T extends core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
 static get Extension|property7() → core::int
   return 0;
 static set Extension|property7(core::int value) → void {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect
index a2932c8..e98b1ac 100644
--- a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.expect
@@ -17,7 +17,7 @@
   return t;
 static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
   return t!;
-static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+static method h<T extends core::Object>(self::h::T? t) → self::h::T
   return t!;
 static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
   self::f<dynamic>(d);
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect
index a2932c8..e98b1ac 100644
--- a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   return t;
 static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
   return t!;
-static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+static method h<T extends core::Object>(self::h::T? t) → self::h::T
   return t!;
 static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
   self::f<dynamic>(d);
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect
index a2932c8..e98b1ac 100644
--- a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.expect
@@ -17,7 +17,7 @@
   return t;
 static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
   return t!;
-static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+static method h<T extends core::Object>(self::h::T? t) → self::h::T
   return t!;
 static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
   self::f<dynamic>(d);
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.outline.expect
index 4238908..ed7979e 100644
--- a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.outline.expect
@@ -6,7 +6,7 @@
   ;
 static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
   ;
-static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+static method h<T extends core::Object>(self::h::T? t) → self::h::T
   ;
 static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect
index a2932c8..e98b1ac 100644
--- a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
   return t;
 static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
   return t!;
-static method h<T extends core::Object = core::Object>(self::h::T? t) → self::h::T
+static method h<T extends core::Object>(self::h::T? t) → self::h::T
   return t!;
 static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
   self::f<dynamic>(d);
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect
index 05572ee..aade648 100644
--- a/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect
@@ -17,7 +17,7 @@
     : super self::B::•()
     ;
 }
-class Foo<T extends self::A? = self::A?> extends core::Object {
+class Foo<T extends self::A?> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T%>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect
index 05572ee..aade648 100644
--- a/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
     : super self::B::•()
     ;
 }
-class Foo<T extends self::A? = self::A?> extends core::Object {
+class Foo<T extends self::A?> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T%>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.expect
index 05572ee..aade648 100644
--- a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.expect
@@ -17,7 +17,7 @@
     : super self::B::•()
     ;
 }
-class Foo<T extends self::A? = self::A?> extends core::Object {
+class Foo<T extends self::A?> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T%>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.outline.expect
index 2359ed4..748d6bc 100644
--- a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.outline.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → self::C
     ;
 }
-class Foo<T extends self::A? = self::A?> extends core::Object {
+class Foo<T extends self::A?> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T%>
     ;
   method doPromotionsToNullable(generic-covariant-impl self::Foo::T% t) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.transformed.expect
index 05572ee..aade648 100644
--- a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.transformed.expect
@@ -17,7 +17,7 @@
     : super self::B::•()
     ;
 }
-class Foo<T extends self::A? = self::A?> extends core::Object {
+class Foo<T extends self::A?> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T%>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect
index 0389f74..c313dbe 100644
--- a/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.expect
@@ -8,18 +8,18 @@
     ;
   get t() → core::Type
     return self::GenericMethodBounds::T%;
-  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
-  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+  method bar<E extends (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
 }
 class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
   synthetic constructor •() → self::GenericMethodBoundsDerived
     : super self::GenericMethodBounds::•()
     ;
-  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+  method foo<generic-covariant-impl E extends core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
-  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+  method bar<E extends (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect
index 0389f74..c313dbe 100644
--- a/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.strong.transformed.expect
@@ -8,18 +8,18 @@
     ;
   get t() → core::Type
     return self::GenericMethodBounds::T%;
-  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
-  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+  method bar<E extends (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
 }
 class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
   synthetic constructor •() → self::GenericMethodBoundsDerived
     : super self::GenericMethodBounds::•()
     ;
-  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+  method foo<generic-covariant-impl E extends core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
-  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+  method bar<E extends (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect
index 0389f74..c313dbe 100644
--- a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.expect
@@ -8,18 +8,18 @@
     ;
   get t() → core::Type
     return self::GenericMethodBounds::T%;
-  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
-  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+  method bar<E extends (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
 }
 class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
   synthetic constructor •() → self::GenericMethodBoundsDerived
     : super self::GenericMethodBounds::•()
     ;
-  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+  method foo<generic-covariant-impl E extends core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
-  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+  method bar<E extends (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.outline.expect
index f26dd6e..6c29f77 100644
--- a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.outline.expect
@@ -7,17 +7,17 @@
     ;
   get t() → core::Type
     ;
-  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
     ;
-  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+  method bar<E extends (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
     ;
 }
 class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
   synthetic constructor •() → self::GenericMethodBoundsDerived
     ;
-  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+  method foo<generic-covariant-impl E extends core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
     ;
-  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+  method bar<E extends (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect
index 0389f74..c313dbe 100644
--- a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.transformed.expect
@@ -8,18 +8,18 @@
     ;
   get t() → core::Type
     return self::GenericMethodBounds::T%;
-  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T% = self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+  method foo<generic-covariant-impl E extends self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
-  method bar<E extends (self::GenericMethodBounds::T%) → void = (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+  method bar<E extends (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
 }
 class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
   synthetic constructor •() → self::GenericMethodBoundsDerived
     : super self::GenericMethodBounds::•()
     ;
-  method foo<generic-covariant-impl E extends core::num = core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+  method foo<generic-covariant-impl E extends core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
-  method bar<E extends (core::num) → void = (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+  method bar<E extends (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
     return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
index 8e9c78d..ff89535 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
@@ -26,14 +26,14 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::C::T%> = FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
     return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::D::T%> = FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
     return x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
index cba6e85..15445a8 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
@@ -26,14 +26,14 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::C::T%> = FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
     return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::D::T%> = FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
     return x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
index 8e9c78d..ff89535 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
@@ -26,14 +26,14 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::C::T%> = FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
     return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::D::T%> = FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
     return x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.outline.expect
index 57db9b1..90d1660 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.outline.expect
@@ -20,13 +20,13 @@
 class C<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T%>
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::C::T%> = FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
     ;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::D::T%> = FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
index cba6e85..15445a8 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
@@ -26,14 +26,14 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::C::T%> = FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::C::T%>>(generic-covariant-impl FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
     return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends FutureOr<self::D::T%> = FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
+  method baz<generic-covariant-impl X extends FutureOr<self::D::T%>>(generic-covariant-impl FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
     return x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
index 8a8d3f2..818e367a 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+static method test<X extends Null, Y extends Never?, Z extends Never>() → dynamic {
   (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
index 8a8d3f2..818e367a 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+static method test<X extends Null, Y extends Never?, Z extends Never>() → dynamic {
   (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
index 8a8d3f2..818e367a 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+static method test<X extends Null, Y extends Never?, Z extends Never>() → dynamic {
   (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.outline.expect
index f683084..276ac6a 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.outline.expect
@@ -3,5 +3,5 @@
 
 static method main() → dynamic
   ;
-static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
+static method test<X extends Null, Y extends Never?, Z extends Never>() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
index 8a8d3f2..818e367a 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+static method test<X extends Null, Y extends Never?, Z extends Never>() → dynamic {
   (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
index 2094805..f04b2c9 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
@@ -30,26 +30,26 @@
     ;
 }
 static method test1(self::C<core::num> c) → dynamic {
-  <S extends core::num = core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num = core::num>(S s) → core::num {
+  <S extends core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num>(S s) → core::num {
     return s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num> = FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num> = FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> async {
+  <S extends FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> async {
     return (await t).{core::num::+}(1);
   };
 }
 static method test2(self::C<core::num?> c) → dynamic {
-  <S extends core::num? = core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num? = core::num?>(S% s) → core::num {
+  <S extends core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num?>(S% s) → core::num {
     return let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:33:14: Error: Operator '+' cannot be called on 'S' because it is potentially null.
     return s + 1; // error
              ^" in s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> async {
+  <S extends FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> async {
     return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:36:22: Error: Operator '+' cannot be called on 'num?' because it is potentially null.
     return (await t) + 1; // error
                      ^" in (await t).{core::num::+}(1);
   };
 }
-static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
+static method test3<S extends core::num?>(self::test3::S% s) → dynamic
   return let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:40:33: Error: Operator '+' cannot be called on 'S' because it is potentially null.
 test3<S extends num?>(S s) => s + 1; // error
                                 ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
index 8a37343..7d2ec63 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
@@ -31,10 +31,10 @@
     ;
 }
 static method test1(self::C<core::num> c) → dynamic {
-  <S extends core::num = core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num = core::num>(S s) → core::num {
+  <S extends core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num>(S s) → core::num {
     return s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num> = FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num> = FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> /* originally async */ {
+  <S extends FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> /* originally async */ {
     final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
     core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
@@ -65,12 +65,12 @@
   };
 }
 static method test2(self::C<core::num?> c) → dynamic {
-  <S extends core::num? = core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num? = core::num?>(S% s) → core::num {
+  <S extends core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num?>(S% s) → core::num {
     return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:33:14: Error: Operator '+' cannot be called on 'S' because it is potentially null.
     return s + 1; // error
              ^" in s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> /* originally async */ {
+  <S extends FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> /* originally async */ {
     final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
     core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
@@ -103,7 +103,7 @@
     return :async_future;
   };
 }
-static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
+static method test3<S extends core::num?>(self::test3::S% s) → dynamic
   return let final Never #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:40:33: Error: Operator '+' cannot be called on 'S' because it is potentially null.
 test3<S extends num?>(S s) => s + 1; // error
                                 ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
index 2094805..f04b2c9 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
@@ -30,26 +30,26 @@
     ;
 }
 static method test1(self::C<core::num> c) → dynamic {
-  <S extends core::num = core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num = core::num>(S s) → core::num {
+  <S extends core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num>(S s) → core::num {
     return s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num> = FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num> = FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> async {
+  <S extends FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> async {
     return (await t).{core::num::+}(1);
   };
 }
 static method test2(self::C<core::num?> c) → dynamic {
-  <S extends core::num? = core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num? = core::num?>(S% s) → core::num {
+  <S extends core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num?>(S% s) → core::num {
     return let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:33:14: Error: Operator '+' cannot be called on 'S' because it is potentially null.
     return s + 1; // error
              ^" in s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> async {
+  <S extends FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> async {
     return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:36:22: Error: Operator '+' cannot be called on 'num?' because it is potentially null.
     return (await t) + 1; // error
                      ^" in (await t).{core::num::+}(1);
   };
 }
-static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
+static method test3<S extends core::num?>(self::test3::S% s) → dynamic
   return let final Never #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:40:33: Error: Operator '+' cannot be called on 'S' because it is potentially null.
 test3<S extends num?>(S s) => s + 1; // error
                                 ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.outline.expect
index 424dea6..97c9f60 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.outline.expect
@@ -16,7 +16,7 @@
   ;
 static method test2(self::C<core::num?> c) → dynamic
   ;
-static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
+static method test3<S extends core::num?>(self::test3::S% s) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
index 8a37343..7d2ec63 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
@@ -31,10 +31,10 @@
     ;
 }
 static method test1(self::C<core::num> c) → dynamic {
-  <S extends core::num = core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num = core::num>(S s) → core::num {
+  <S extends core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num>(S s) → core::num {
     return s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num> = FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num> = FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> /* originally async */ {
+  <S extends FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> /* originally async */ {
     final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
     core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
@@ -65,12 +65,12 @@
   };
 }
 static method test2(self::C<core::num?> c) → dynamic {
-  <S extends core::num? = core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num? = core::num?>(S% s) → core::num {
+  <S extends core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num?>(S% s) → core::num {
     return let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:33:14: Error: Operator '+' cannot be called on 'S' because it is potentially null.
     return s + 1; // error
              ^" in s.{core::num::+}(1);
   };
-  <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?> = FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> /* originally async */ {
+  <S extends FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> /* originally async */ {
     final asy::_Future<core::num> :async_future = new asy::_Future::•<core::num>();
     core::bool* :is_sync = false;
     FutureOr<core::num>? :return_value;
@@ -103,7 +103,7 @@
     return :async_future;
   };
 }
-static method test3<S extends core::num? = core::num?>(self::test3::S% s) → dynamic
+static method test3<S extends core::num?>(self::test3::S% s) → dynamic
   return let final Never #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:40:33: Error: Operator '+' cannot be called on 'S' because it is potentially null.
 test3<S extends num?>(S s) => s + 1; // error
                                 ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
index c4d8855..588916e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
@@ -13,18 +13,18 @@
 import self as self;
 import "dart:core" as core;
 
-static method test1<S extends core::num = core::num>(self::test1::S s) → dynamic {
+static method test1<S extends core::num>(self::test1::S s) → dynamic {
   core::num t = s.{core::num::+}(1);
 }
-static method test2<S extends core::num? = core::num?>(self::test2::S% s) → dynamic {
+static method test2<S extends core::num?>(self::test2::S% s) → dynamic {
   core::num t = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:10:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
 }
-static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
+static method test3<S extends core::int>(self::test3::S s) → dynamic {
   core::int t = s.{core::num::+}(1);
 }
-static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
+static method test4<S extends core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
index c4d8855..588916e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
@@ -13,18 +13,18 @@
 import self as self;
 import "dart:core" as core;
 
-static method test1<S extends core::num = core::num>(self::test1::S s) → dynamic {
+static method test1<S extends core::num>(self::test1::S s) → dynamic {
   core::num t = s.{core::num::+}(1);
 }
-static method test2<S extends core::num? = core::num?>(self::test2::S% s) → dynamic {
+static method test2<S extends core::num?>(self::test2::S% s) → dynamic {
   core::num t = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:10:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
 }
-static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
+static method test3<S extends core::int>(self::test3::S s) → dynamic {
   core::int t = s.{core::num::+}(1);
 }
-static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
+static method test4<S extends core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
index c4d8855..588916e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
@@ -13,18 +13,18 @@
 import self as self;
 import "dart:core" as core;
 
-static method test1<S extends core::num = core::num>(self::test1::S s) → dynamic {
+static method test1<S extends core::num>(self::test1::S s) → dynamic {
   core::num t = s.{core::num::+}(1);
 }
-static method test2<S extends core::num? = core::num?>(self::test2::S% s) → dynamic {
+static method test2<S extends core::num?>(self::test2::S% s) → dynamic {
   core::num t = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:10:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
 }
-static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
+static method test3<S extends core::int>(self::test3::S s) → dynamic {
   core::int t = s.{core::num::+}(1);
 }
-static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
+static method test4<S extends core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.outline.expect
index f86a56b..af3a068 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static method test1<S extends core::num = core::num>(self::test1::S s) → dynamic
+static method test1<S extends core::num>(self::test1::S s) → dynamic
   ;
-static method test2<S extends core::num? = core::num?>(self::test2::S% s) → dynamic
+static method test2<S extends core::num?>(self::test2::S% s) → dynamic
   ;
-static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic
+static method test3<S extends core::int>(self::test3::S s) → dynamic
   ;
-static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic
+static method test4<S extends core::int?>(self::test4::S% s) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
index c4d8855..588916e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
@@ -13,18 +13,18 @@
 import self as self;
 import "dart:core" as core;
 
-static method test1<S extends core::num = core::num>(self::test1::S s) → dynamic {
+static method test1<S extends core::num>(self::test1::S s) → dynamic {
   core::num t = s.{core::num::+}(1);
 }
-static method test2<S extends core::num? = core::num?>(self::test2::S% s) → dynamic {
+static method test2<S extends core::num?>(self::test2::S% s) → dynamic {
   core::num t = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:10:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
 }
-static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
+static method test3<S extends core::int>(self::test3::S s) → dynamic {
   core::int t = s.{core::num::+}(1);
 }
-static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
+static method test4<S extends core::int?>(self::test4::S% s) → dynamic {
   core::num t = let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
   var t = s + 1; // error
             ^" in s.{core::num::+}(1);
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect
index 01926cd..3952efc 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
+  return <S2 extends self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect
index 01926cd..3952efc 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.strong.transformed.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
+  return <S2 extends self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect
index 01926cd..3952efc 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
+  return <S2 extends self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect
index 01926cd..3952efc 100644
--- a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.transformed.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
-  return <S2 extends self::i1::R? = self::i1::R?>() → void {};
+  return <S2 extends self::i1::R?>() → void {};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
index 77cfde0..717c859 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
@@ -195,11 +195,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
-typedef FReturn<X extends core::num = core::num> = () → X;
-typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
-typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
-class A<T extends core::num = core::num> extends core::Object {
+typedef FArgument<contravariant X extends core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num> = () → X;
+typedef FBoth<invariant X extends core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num> = () → dynamic;
+class A<T extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
index 77cfde0..717c859 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
@@ -195,11 +195,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
-typedef FReturn<X extends core::num = core::num> = () → X;
-typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
-typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
-class A<T extends core::num = core::num> extends core::Object {
+typedef FArgument<contravariant X extends core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num> = () → X;
+typedef FBoth<invariant X extends core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num> = () → dynamic;
+class A<T extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
index 77cfde0..717c859 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
@@ -195,11 +195,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
-typedef FReturn<X extends core::num = core::num> = () → X;
-typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
-typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
-class A<T extends core::num = core::num> extends core::Object {
+typedef FArgument<contravariant X extends core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num> = () → X;
+typedef FBoth<invariant X extends core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num> = () → dynamic;
+class A<T extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.outline.expect
index 2034770..d17a02c 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
-typedef FReturn<X extends core::num = core::num> = () → X;
-typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
-typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
-class A<T extends core::num = core::num> extends core::Object {
+typedef FArgument<contravariant X extends core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num> = () → X;
+typedef FBoth<invariant X extends core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num> = () → dynamic;
+class A<T extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
index 77cfde0..717c859 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
@@ -195,11 +195,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FArgument<contravariant X extends core::num = core::num> = (X) → dynamic;
-typedef FReturn<X extends core::num = core::num> = () → X;
-typedef FBoth<invariant X extends core::num = core::num> = (X) → X;
-typedef FNowhere<unrelated X extends core::num = core::num> = () → dynamic;
-class A<T extends core::num = core::num> extends core::Object {
+typedef FArgument<contravariant X extends core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num> = () → X;
+typedef FBoth<invariant X extends core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num> = () → dynamic;
+class A<T extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
index db8fd3e..2d7f2f7 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+typedef Test<contravariant T extends self::X> = (T?) → dynamic;
 class X extends core::Object {
   synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
-static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
   (self::X?) → dynamic t2 = #C1<self::X>;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
index 87a95fd..bb2b62a 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+typedef Test<contravariant T extends self::X> = (T?) → dynamic;
 class X extends core::Object {
   synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
-static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
   (self::X?) → dynamic t2 = #C1<self::X>;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
index db8fd3e..2d7f2f7 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+typedef Test<contravariant T extends self::X> = (T?) → dynamic;
 class X extends core::Object {
   synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
-static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
   (self::X?) → dynamic t2 = #C1<self::X>;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.outline.expect
index 3c8de2a..ffd1301 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+typedef Test<contravariant T extends self::X> = (T?) → dynamic;
 class X extends core::Object {
   synthetic constructor •() → self::X
     ;
 }
-static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic
+static method checkme<T extends self::X>(self::checkme::T? t) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
index 7c42561..4754890 100644
--- a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+typedef Test<contravariant T extends self::X> = (T?) → dynamic;
 class X extends core::Object {
   synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
-static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
 static method main() → dynamic {
   (self::X?) → dynamic t2 = #C1<self::X>;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
index 5370148..d04548d 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
@@ -182,7 +182,7 @@
     #t25.{core::Map::[]=}{Invariant}(n1, n1);
   } =>#t25;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t28 = core::List::of<Never>(n1);
   } =>#t28;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
index 58a9aad..57f8fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -199,7 +199,7 @@
     #t25.{core::Map::[]=}{Invariant}(n1, n1);
   } =>#t25;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t28 = core::List::of<Never>(n1);
   } =>#t28;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
index 79c5408..0eb909b 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
@@ -183,7 +183,7 @@
     #t47.{core::Map::[]=}{Invariant}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t47;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t52 = core::List::of<Never>(let final self::test2::N1 #t53 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t52;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.outline.expect
index d2e2ef3..f2ca1af 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.outline.expect
@@ -3,7 +3,7 @@
 
 static method test1(Never n1, Never? n2, Null n3) → dynamic
   ;
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
+static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
index 6e5b756..645b792 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -200,7 +200,7 @@
     #t47.{core::Map::[]=}{Invariant}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t47;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t52 = core::List::of<Never>(let final self::test2::N1 #t53 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t52;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
index 39c2e9c..19e109d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -202,20 +202,20 @@
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num> extends core::Object {
+class D<X extends core::num> extends core::Object {
   synthetic constructor •() → self::D<self::D::X>
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
+  method method1<Y extends self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
     self::A<self::A<Null>>? d;
   }
-  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+  method method2<Y extends core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
     self::D<core::String>? d;
   }
@@ -241,7 +241,7 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>?> on self::A<X%> {
 }
 static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
@@ -249,12 +249,12 @@
 }
 static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
   return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
-static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
 }
-static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
-  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
   self::A<Null> a = new self::A::•<Null>();
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
index 0fcf8ea..48a5a0a 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -202,20 +202,20 @@
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num> extends core::Object {
+class D<X extends core::num> extends core::Object {
   synthetic constructor •() → self::D<self::D::X>
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
+  method method1<Y extends self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
     self::A<self::A<Null>>? d;
   }
-  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+  method method2<Y extends core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
     self::D<core::String>? d;
   }
@@ -241,7 +241,7 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>?> on self::A<X%> {
 }
 static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
@@ -249,12 +249,12 @@
 }
 static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
   return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
-static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
 }
-static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
-  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
   self::A<Null> a = new self::A::•<Null>();
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
index 39c2e9c..19e109d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -202,20 +202,20 @@
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num> extends core::Object {
+class D<X extends core::num> extends core::Object {
   synthetic constructor •() → self::D<self::D::X>
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
+  method method1<Y extends self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
     self::A<self::A<Null>>? d;
   }
-  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+  method method2<Y extends core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
     self::D<core::String>? d;
   }
@@ -241,7 +241,7 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>?> on self::A<X%> {
 }
 static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
@@ -249,12 +249,12 @@
 }
 static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
   return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
-static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
 }
-static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
-  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
   self::A<Null> a = new self::A::•<Null>();
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
index 02689e0..aef5c33 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
@@ -108,16 +108,16 @@
   synthetic constructor •() → self::A<self::A::X%>
     ;
 }
-class D<X extends core::num = core::num> extends core::Object {
+class D<X extends core::num> extends core::Object {
   synthetic constructor •() → self::D<self::D::X>
     ;
 }
-class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     ;
-  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void
+  method method1<Y extends self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void
     ;
-  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void
+  method method2<Y extends core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void
     ;
 }
 class C extends core::Object {
@@ -135,16 +135,16 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>?> on self::A<X%> {
 }
 static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void
   ;
 static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
   return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
-static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void
   ;
-static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
-  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
index 0fcf8ea..48a5a0a 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -202,20 +202,20 @@
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num> extends core::Object {
+class D<X extends core::num> extends core::Object {
   synthetic constructor •() → self::D<self::D::X>
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
+  method method1<Y extends self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
     self::A<self::A<Null>>? d;
   }
-  method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+  method method2<Y extends core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
     self::D<core::String>? d;
   }
@@ -241,7 +241,7 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>?> on self::A<X%> {
 }
 static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
@@ -249,12 +249,12 @@
 }
 static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
   return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
-static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
 }
-static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
-  return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
   self::A<Null> a = new self::A::•<Null>();
 }
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
index 3c826d1..a77f5c0 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.expect
@@ -91,7 +91,7 @@
   if(self::i.{core::num::>}(0))
     #t5.{core::List::addAll}{Invariant}(self::nullableList!);
 } =>#t5;
-static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
@@ -110,7 +110,7 @@
         #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t6;
 }
-static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
     #t9.{core::Set::add}{Invariant}(0);
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
index afc253c..04e38068 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.strong.transformed.expect
@@ -99,7 +99,7 @@
   if(self::i.{core::num::>}(0))
     #t5.{core::List::addAll}{Invariant}(self::nullableList!);
 } =>#t5;
-static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
@@ -126,7 +126,7 @@
     }
   } =>#t6;
 }
-static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = new col::_CompactLinkedHashSet::•<dynamic>();
     #t9.{core::Set::add}{Invariant}(0);
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
index 3c826d1..a77f5c0 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.expect
@@ -91,7 +91,7 @@
   if(self::i.{core::num::>}(0))
     #t5.{core::List::addAll}{Invariant}(self::nullableList!);
 } =>#t5;
-static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
@@ -110,7 +110,7 @@
         #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
   } =>#t6;
 }
-static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
     #t9.{core::Set::add}{Invariant}(0);
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.outline.expect
index d008a19..ef444c5 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.outline.expect
@@ -10,9 +10,9 @@
 static field core::Map<dynamic, dynamic> map1;
 static field core::Set<dynamic> set1;
 static field core::List<dynamic> list1;
-static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic
+static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic
   ;
-static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic
+static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
index afc253c..04e38068 100644
--- a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.transformed.expect
@@ -99,7 +99,7 @@
   if(self::i.{core::num::>}(0))
     #t5.{core::List::addAll}{Invariant}(self::nullableList!);
 } =>#t5;
-static method testMap<X extends dynamic = dynamic, Y extends core::Map<core::int, core::String>? = core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String> = core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
   core::Map<dynamic, dynamic> map2 = block {
     final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
     if(self::i.{core::num::>}(0))
@@ -126,7 +126,7 @@
     }
   } =>#t6;
 }
-static method testIterables<X extends dynamic = dynamic, Y extends core::List<core::int>? = core::List<core::int>?, Z extends core::List<core::int> = core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
   core::Set<dynamic> set2 = block {
     final core::Set<dynamic> #t9 = new col::_CompactLinkedHashSet::•<dynamic>();
     #t9.{core::Set::add}{Invariant}(0);
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect
index 3bfcc52..cd83b1e 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.expect
@@ -44,7 +44,7 @@
   get barExtension = self::Extension|get#barExtension;
   set fooExtension = self::Extension|set#fooExtension;
 }
-static method test<T extends self::A? = self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
+static method test<T extends self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
   let final self::A? #t1 = a in (let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
@@ -69,7 +69,7 @@
 static method Extension|set#fooExtension(lowered final self::B #this, core::int? value) → void {}
 static method Extension|get#barExtension(lowered final self::B #this) → self::B
   return new self::B::•();
-static method testExtension<T extends self::B? = self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
+static method testExtension<T extends self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
   let final self::B? #t10 = b in (let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect
index 3bfcc52..cd83b1e 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.strong.transformed.expect
@@ -44,7 +44,7 @@
   get barExtension = self::Extension|get#barExtension;
   set fooExtension = self::Extension|set#fooExtension;
 }
-static method test<T extends self::A? = self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
+static method test<T extends self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
   let final self::A? #t1 = a in (let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
@@ -69,7 +69,7 @@
 static method Extension|set#fooExtension(lowered final self::B #this, core::int? value) → void {}
 static method Extension|get#barExtension(lowered final self::B #this) → self::B
   return new self::B::•();
-static method testExtension<T extends self::B? = self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
+static method testExtension<T extends self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
   let final self::B? #t10 = b in (let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect
index 3bfcc52..cd83b1e 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.expect
@@ -44,7 +44,7 @@
   get barExtension = self::Extension|get#barExtension;
   set fooExtension = self::Extension|set#fooExtension;
 }
-static method test<T extends self::A? = self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
+static method test<T extends self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
   let final self::A? #t1 = a in (let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
@@ -69,7 +69,7 @@
 static method Extension|set#fooExtension(lowered final self::B #this, core::int? value) → void {}
 static method Extension|get#barExtension(lowered final self::B #this) → self::B
   return new self::B::•();
-static method testExtension<T extends self::B? = self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
+static method testExtension<T extends self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
   let final self::B? #t10 = b in (let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.outline.expect
index 795331a..cb81d1f 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.outline.expect
@@ -17,7 +17,7 @@
   get barExtension = self::Extension|get#barExtension;
   set fooExtension = self::Extension|set#fooExtension;
 }
-static method test<T extends self::A? = self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic
+static method test<T extends self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic
   ;
 static method Extension|get#fooExtension(lowered final self::B #this) → core::int?
   ;
@@ -25,7 +25,7 @@
   ;
 static method Extension|get#barExtension(lowered final self::B #this) → self::B
   ;
-static method testExtension<T extends self::B? = self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic
+static method testExtension<T extends self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect
index 3bfcc52..cd83b1e 100644
--- a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.transformed.expect
@@ -44,7 +44,7 @@
   get barExtension = self::Extension|get#barExtension;
   set fooExtension = self::Extension|set#fooExtension;
 }
-static method test<T extends self::A? = self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
+static method test<T extends self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
   let final self::A? #t1 = a in (let final Never #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
@@ -69,7 +69,7 @@
 static method Extension|set#fooExtension(lowered final self::B #this, core::int? value) → void {}
 static method Extension|get#barExtension(lowered final self::B #this) → self::B
   return new self::B::•();
-static method testExtension<T extends self::B? = self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
+static method testExtension<T extends self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
   let final self::B? #t10 = b in (let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
 Try accessing using ?. instead.
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
index e6ba91c..9a0b8b5 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%, self::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
index 47bd5a2..ceddbed 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%, self::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
index e6ba91c..9a0b8b5 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%, self::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.outline.expect
index d9fa31c..dfdf23f 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%, self::C::Y>
     ;
   method test(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y? y) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
index 47bd5a2..ceddbed 100644
--- a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%, self::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
index 0934075..e5985d6 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.expect
@@ -449,7 +449,7 @@
     }
   } =>#t98];
 }
-static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
+static method bar<X extends core::List<core::int>?, Y extends core::Set<core::int>?, Z extends core::Iterable<core::int>?, W extends core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
     final core::Set<core::int> #t101 = col::LinkedHashSet::•<core::int>();
     for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
index 3162d81..7d89db1 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.strong.transformed.expect
@@ -635,7 +635,7 @@
     }
   } =>#t98];
 }
-static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
+static method bar<X extends core::List<core::int>?, Y extends core::Set<core::int>?, Z extends core::Iterable<core::int>?, W extends core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
     final core::Set<core::int> #t101 = new col::_CompactLinkedHashSet::•<core::int>();
     {
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
index 0934075..e5985d6 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.expect
@@ -449,7 +449,7 @@
     }
   } =>#t98];
 }
-static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
+static method bar<X extends core::List<core::int>?, Y extends core::Set<core::int>?, Z extends core::Iterable<core::int>?, W extends core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
     final core::Set<core::int> #t101 = col::LinkedHashSet::•<core::int>();
     for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.outline.expect
index 89dfdbb..3389234 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.outline.expect
@@ -4,7 +4,7 @@
 
 static method foo(core::bool condition, core::Iterable<dynamic> iterable, core::List<core::int>? a, core::Set<core::int>? b, core::Iterable<core::int>? c, core::Map<core::int, core::int>? d) → dynamic
   ;
-static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic
+static method bar<X extends core::List<core::int>?, Y extends core::Set<core::int>?, Z extends core::Iterable<core::int>?, W extends core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
index 3162d81..7d89db1 100644
--- a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.transformed.expect
@@ -635,7 +635,7 @@
     }
   } =>#t98];
 }
-static method bar<X extends core::List<core::int>? = core::List<core::int>?, Y extends core::Set<core::int>? = core::Set<core::int>?, Z extends core::Iterable<core::int>? = core::Iterable<core::int>?, W extends core::Map<core::int, core::int>? = core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
+static method bar<X extends core::List<core::int>?, Y extends core::Set<core::int>?, Z extends core::Iterable<core::int>?, W extends core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
   return <core::Object>[ block {
     final core::Set<core::int> #t101 = new col::_CompactLinkedHashSet::•<core::int>();
     {
diff --git a/pkg/front_end/testcases/nnbd/issue43536.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43536.dart.strong.expect
index e22d4b0..de6fdb8 100644
--- a/pkg/front_end/testcases/nnbd/issue43536.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43536.dart.strong.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method foo<generic-covariant-impl E extends self::C::T% = self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
+  method foo<generic-covariant-impl E extends self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
     core::List<self::C::foo::E%> variable = this.{self::C::method}<self::C::foo::E%>(list);
   }
-  method method<generic-covariant-impl F extends self::C::T% = self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
+  method method<generic-covariant-impl F extends self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
     return list;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43536.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43536.dart.strong.transformed.expect
index e22d4b0..de6fdb8 100644
--- a/pkg/front_end/testcases/nnbd/issue43536.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43536.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method foo<generic-covariant-impl E extends self::C::T% = self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
+  method foo<generic-covariant-impl E extends self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
     core::List<self::C::foo::E%> variable = this.{self::C::method}<self::C::foo::E%>(list);
   }
-  method method<generic-covariant-impl F extends self::C::T% = self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
+  method method<generic-covariant-impl F extends self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
     return list;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.expect
index e22d4b0..de6fdb8 100644
--- a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method foo<generic-covariant-impl E extends self::C::T% = self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
+  method foo<generic-covariant-impl E extends self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
     core::List<self::C::foo::E%> variable = this.{self::C::method}<self::C::foo::E%>(list);
   }
-  method method<generic-covariant-impl F extends self::C::T% = self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
+  method method<generic-covariant-impl F extends self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
     return list;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.outline.expect
index 15e7e74..db3198e 100644
--- a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.outline.expect
@@ -5,9 +5,9 @@
 class C<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T%>
     ;
-  method foo<generic-covariant-impl E extends self::C::T% = self::C::T%>(core::List<self::C::foo::E%> list) → dynamic
+  method foo<generic-covariant-impl E extends self::C::T%>(core::List<self::C::foo::E%> list) → dynamic
     ;
-  method method<generic-covariant-impl F extends self::C::T% = self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
+  method method<generic-covariant-impl F extends self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.transformed.expect
index e22d4b0..de6fdb8 100644
--- a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.transformed.expect
@@ -6,10 +6,10 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method foo<generic-covariant-impl E extends self::C::T% = self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
+  method foo<generic-covariant-impl E extends self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
     core::List<self::C::foo::E%> variable = this.{self::C::method}<self::C::foo::E%>(list);
   }
-  method method<generic-covariant-impl F extends self::C::T% = self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
+  method method<generic-covariant-impl F extends self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
     return list;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
index d9bdceb..c09bec5 100644
--- a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.expect
@@ -10,7 +10,7 @@
 static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
   (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
 }
-static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+static method method2<S extends dynamic>(self::method2::S% s) → dynamic {
   self::throws(() → void => s.f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
index d9bdceb..c09bec5 100644
--- a/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
   (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
 }
-static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+static method method2<S extends dynamic>(self::method2::S% s) → dynamic {
   self::throws(() → void => s.f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
index d9bdceb..c09bec5 100644
--- a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.expect
@@ -10,7 +10,7 @@
 static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
   (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
 }
-static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+static method method2<S extends dynamic>(self::method2::S% s) → dynamic {
   self::throws(() → void => s.f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.outline.expect
index f3c723d..9128f85 100644
--- a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.outline.expect
@@ -9,7 +9,7 @@
   ;
 static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic
   ;
-static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic
+static method method2<S extends dynamic>(self::method2::S% s) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
index d9bdceb..c09bec5 100644
--- a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
   (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
 }
-static method method2<S extends dynamic = dynamic>(self::method2::S% s) → dynamic {
+static method method2<S extends dynamic>(self::method2::S% s) → dynamic {
   self::throws(() → void => s.f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
index 2d1e9e6..d0065b3 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
@@ -21,8 +21,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<Y extends core::num = core::num> = () → Y;
-typedef F2<Y extends core::num = core::num> = () → Y;
+typedef F<Y extends core::num> = () → Y;
+typedef F2<Y extends core::num> = () → Y;
 class A<X extends () → self::A::X = () → dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
index 2d1e9e6..d0065b3 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
@@ -21,8 +21,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<Y extends core::num = core::num> = () → Y;
-typedef F2<Y extends core::num = core::num> = () → Y;
+typedef F<Y extends core::num> = () → Y;
+typedef F2<Y extends core::num> = () → Y;
 class A<X extends () → self::A::X = () → dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
index 2d1e9e6..d0065b3 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
@@ -21,8 +21,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<Y extends core::num = core::num> = () → Y;
-typedef F2<Y extends core::num = core::num> = () → Y;
+typedef F<Y extends core::num> = () → Y;
+typedef F2<Y extends core::num> = () → Y;
 class A<X extends () → self::A::X = () → dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect
index 6628b32..5fc32cd 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect
@@ -21,8 +21,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<Y extends core::num = core::num> = () → Y;
-typedef F2<Y extends core::num = core::num> = () → Y;
+typedef F<Y extends core::num> = () → Y;
+typedef F2<Y extends core::num> = () → Y;
 class A<X extends () → self::A::X = () → dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     ;
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
index 2d1e9e6..d0065b3 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
@@ -21,8 +21,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<Y extends core::num = core::num> = () → Y;
-typedef F2<Y extends core::num = core::num> = () → Y;
+typedef F<Y extends core::num> = () → Y;
+typedef F2<Y extends core::num> = () → Y;
 class A<X extends () → self::A::X = () → dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
index ad063b4..bfb240b 100644
--- a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.expect
@@ -9,5 +9,5 @@
 }
 
 constants  {
-  #C1 = TypeLiteralConstant((<T extends Never* = Never*>(Never*) →* void) →* Never*)
+  #C1 = TypeLiteralConstant((<T extends Never*>(Never*) →* void) →* Never*)
 }
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
index dd62920..e19c801 100644
--- a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.transformed.expect
@@ -9,7 +9,7 @@
 }
 
 constants  {
-  #C1 = TypeLiteralConstant((<T extends Never* = Never*>(Never*) →* void) →* Never*)
+  #C1 = TypeLiteralConstant((<T extends Never*>(Never*) →* void) →* Never*)
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect
index 2057990..9ffcc4a 100644
--- a/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num = core::num> extends core::Object {
+class Foo<S extends core::num> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect
index 2057990..9ffcc4a 100644
--- a/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num = core::num> extends core::Object {
+class Foo<S extends core::num> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect
index 2057990..9ffcc4a 100644
--- a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num = core::num> extends core::Object {
+class Foo<S extends core::num> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.outline.expect
index 3cfc9db..1df50f2 100644
--- a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num = core::num> extends core::Object {
+class Foo<S extends core::num> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S>
     ;
   method test1(generic-covariant-impl self::Foo::S x) → void
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect
index 2057990..9ffcc4a 100644
--- a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<S extends core::num = core::num> extends core::Object {
+class Foo<S extends core::num> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::S>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.expect
index 43662a2..0a42d2b 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.expect
@@ -20,7 +20,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo<T extends core::Object? = core::Object?>() → dynamic {
+static method foo<T extends core::Object?>() → dynamic {
   let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
 Try using List.filled instead.
   new List<T>(42);
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.transformed.expect
index a585522..540795f 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo<T extends core::Object? = core::Object?>() → dynamic {
+static method foo<T extends core::Object?>() → dynamic {
   let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
 Try using List.filled instead.
   new List<T>(42);
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
index 43662a2..0a42d2b 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
@@ -20,7 +20,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo<T extends core::Object? = core::Object?>() → dynamic {
+static method foo<T extends core::Object?>() → dynamic {
   let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
 Try using List.filled instead.
   new List<T>(42);
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.outline.expect
index b622770..174d1e3 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo<T extends core::Object? = core::Object?>() → dynamic
+static method foo<T extends core::Object?>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
index a585522..540795f 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
@@ -20,7 +20,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo<T extends core::Object? = core::Object?>() → dynamic {
+static method foo<T extends core::Object?>() → dynamic {
   let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
 Try using List.filled instead.
   new List<T>(42);
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
index ab8cca2..08602d8 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
@@ -29,7 +29,7 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericNever<T extends Never = Never> extends core::Object {
+class GenericNever<T extends Never> extends core::Object {
   synthetic constructor •() → self::GenericNever<self::GenericNever::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
index ab8cca2..08602d8 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
@@ -29,7 +29,7 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericNever<T extends Never = Never> extends core::Object {
+class GenericNever<T extends Never> extends core::Object {
   synthetic constructor •() → self::GenericNever<self::GenericNever::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
index ab8cca2..08602d8 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
@@ -29,7 +29,7 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericNever<T extends Never = Never> extends core::Object {
+class GenericNever<T extends Never> extends core::Object {
   synthetic constructor •() → self::GenericNever<self::GenericNever::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.outline.expect
index 488d8a3..fce0dc8 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericNever<T extends Never = Never> extends core::Object {
+class GenericNever<T extends Never> extends core::Object {
   synthetic constructor •() → self::GenericNever<self::GenericNever::T>
     ;
   method getParamType() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
index ab8cca2..08602d8 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
@@ -29,7 +29,7 @@
 import self as self;
 import "dart:core" as core;
 
-class GenericNever<T extends Never = Never> extends core::Object {
+class GenericNever<T extends Never> extends core::Object {
   synthetic constructor •() → self::GenericNever<self::GenericNever::T>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
index e9ee16a..19a1ec4 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
@@ -69,7 +69,7 @@
     : self::A::fieldOfA = fieldOfA, super core::Object::•()
     ;
 }
-class B<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class B<X extends core::Object?, Y extends core::Object> extends core::Object {
   generic-covariant-impl field self::B::X% fieldOfB;
   generic-covariant-impl field self::B::Y fieldOfB2;
   constructor foo() → self::B<self::B::X%, self::B::Y>
@@ -83,11 +83,11 @@
   static field core::int staticFieldOfM = null;
   field core::int fieldOfM = null;
 }
-abstract class N<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class N<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   generic-covariant-impl field self::N::X% fieldOfN = null;
   generic-covariant-impl field self::N::Y fieldOfN2 = null;
 }
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   static field core::int? staticFieldOfX = null;
   static field core::int staticFieldOfXInitialized = 42;
   generic-covariant-impl field self::C::X? fieldOfX = null;
@@ -108,7 +108,7 @@
     : self::C::fieldOfC10 = fieldOfC10, super core::Object::•()
     ;
 }
-abstract class L<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class L<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   static field core::int? staticFieldOfL = null;
   static field core::int staticFieldOfLInitialized = 42;
   generic-covariant-impl field self::L::X? fieldOfL = null;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
index e9ee16a..19a1ec4 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
@@ -69,7 +69,7 @@
     : self::A::fieldOfA = fieldOfA, super core::Object::•()
     ;
 }
-class B<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class B<X extends core::Object?, Y extends core::Object> extends core::Object {
   generic-covariant-impl field self::B::X% fieldOfB;
   generic-covariant-impl field self::B::Y fieldOfB2;
   constructor foo() → self::B<self::B::X%, self::B::Y>
@@ -83,11 +83,11 @@
   static field core::int staticFieldOfM = null;
   field core::int fieldOfM = null;
 }
-abstract class N<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class N<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   generic-covariant-impl field self::N::X% fieldOfN = null;
   generic-covariant-impl field self::N::Y fieldOfN2 = null;
 }
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   static field core::int? staticFieldOfX = null;
   static field core::int staticFieldOfXInitialized = 42;
   generic-covariant-impl field self::C::X? fieldOfX = null;
@@ -108,7 +108,7 @@
     : self::C::fieldOfC10 = fieldOfC10, super core::Object::•()
     ;
 }
-abstract class L<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class L<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   static field core::int? staticFieldOfL = null;
   static field core::int staticFieldOfLInitialized = 42;
   generic-covariant-impl field self::L::X? fieldOfL = null;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
index e9ee16a..19a1ec4 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
@@ -69,7 +69,7 @@
     : self::A::fieldOfA = fieldOfA, super core::Object::•()
     ;
 }
-class B<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class B<X extends core::Object?, Y extends core::Object> extends core::Object {
   generic-covariant-impl field self::B::X% fieldOfB;
   generic-covariant-impl field self::B::Y fieldOfB2;
   constructor foo() → self::B<self::B::X%, self::B::Y>
@@ -83,11 +83,11 @@
   static field core::int staticFieldOfM = null;
   field core::int fieldOfM = null;
 }
-abstract class N<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class N<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   generic-covariant-impl field self::N::X% fieldOfN = null;
   generic-covariant-impl field self::N::Y fieldOfN2 = null;
 }
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   static field core::int? staticFieldOfX = null;
   static field core::int staticFieldOfXInitialized = 42;
   generic-covariant-impl field self::C::X? fieldOfX = null;
@@ -108,7 +108,7 @@
     : self::C::fieldOfC10 = fieldOfC10, super core::Object::•()
     ;
 }
-abstract class L<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class L<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   static field core::int? staticFieldOfL = null;
   static field core::int staticFieldOfLInitialized = 42;
   generic-covariant-impl field self::L::X? fieldOfL = null;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.outline.expect
index 03d3614..750e00652 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.outline.expect
@@ -33,7 +33,7 @@
   constructor bar(core::int fieldOfA) → self::A
     ;
 }
-class B<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class B<X extends core::Object?, Y extends core::Object> extends core::Object {
   generic-covariant-impl field self::B::X% fieldOfB;
   generic-covariant-impl field self::B::Y fieldOfB2;
   constructor foo() → self::B<self::B::X%, self::B::Y>
@@ -45,11 +45,11 @@
   static field core::int staticFieldOfM;
   field core::int fieldOfM;
 }
-abstract class N<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class N<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   generic-covariant-impl field self::N::X% fieldOfN;
   generic-covariant-impl field self::N::Y fieldOfN2;
 }
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   static field core::int? staticFieldOfX;
   static field core::int staticFieldOfXInitialized;
   generic-covariant-impl field self::C::X? fieldOfX;
@@ -68,7 +68,7 @@
   constructor bar(core::int fieldOfC10) → self::C<self::C::X%, self::C::Y>
     ;
 }
-abstract class L<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class L<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   static field core::int? staticFieldOfL;
   static field core::int staticFieldOfLInitialized;
   generic-covariant-impl field self::L::X? fieldOfL;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
index e9ee16a..19a1ec4 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
@@ -69,7 +69,7 @@
     : self::A::fieldOfA = fieldOfA, super core::Object::•()
     ;
 }
-class B<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class B<X extends core::Object?, Y extends core::Object> extends core::Object {
   generic-covariant-impl field self::B::X% fieldOfB;
   generic-covariant-impl field self::B::Y fieldOfB2;
   constructor foo() → self::B<self::B::X%, self::B::Y>
@@ -83,11 +83,11 @@
   static field core::int staticFieldOfM = null;
   field core::int fieldOfM = null;
 }
-abstract class N<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class N<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   generic-covariant-impl field self::N::X% fieldOfN = null;
   generic-covariant-impl field self::N::Y fieldOfN2 = null;
 }
-class C<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object {
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
   static field core::int? staticFieldOfX = null;
   static field core::int staticFieldOfXInitialized = 42;
   generic-covariant-impl field self::C::X? fieldOfX = null;
@@ -108,7 +108,7 @@
     : self::C::fieldOfC10 = fieldOfC10, super core::Object::•()
     ;
 }
-abstract class L<X extends core::Object? = core::Object?, Y extends core::Object = core::Object> extends core::Object /*isMixinDeclaration*/  {
+abstract class L<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
   static field core::int? staticFieldOfL = null;
   static field core::int staticFieldOfLInitialized = 42;
   generic-covariant-impl field self::L::X? fieldOfL = null;
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
index 0b89c6b..2c6ff57 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
@@ -116,7 +116,7 @@
   void Function()? f3 = a;
                         ^" in a as{TypeError} () →? void;
 }
-static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
+static method ok<T extends core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
   a.{core::Object::==}(a);
   t.{core::Object::==}(t);
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
index 0b89c6b..2c6ff57 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
@@ -116,7 +116,7 @@
   void Function()? f3 = a;
                         ^" in a as{TypeError} () →? void;
 }
-static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
+static method ok<T extends core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
   a.{core::Object::==}(a);
   t.{core::Object::==}(t);
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.outline.expect
index d88e541e..10a2960 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.outline.expect
@@ -22,7 +22,7 @@
 }
 static method error(core::String? s, self::A? a, self::B? b) → dynamic
   ;
-static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic
+static method ok<T extends core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect b/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
index c539802..d52aac2 100644
--- a/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(n);
   core::num n_i = n.{core::num::+}(i);
   core::double n_d = n.{core::num::+}(d);
@@ -40,7 +40,7 @@
   core::double z_y = z.{core::double::+}(y);
   core::double z_z = z.{core::double::+}(z);
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(n);
   core::num n_i = n.{core::num::-}(i);
   core::double n_d = n.{core::num::-}(d);
@@ -78,7 +78,7 @@
   core::double z_y = z.{core::double::-}(y);
   core::double z_z = z.{core::double::-}(z);
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(n);
   core::num n_i = n.{core::num::*}(i);
   core::double n_d = n.{core::num::*}(d);
@@ -116,7 +116,7 @@
   core::double z_y = z.{core::double::*}(y);
   core::double z_z = z.{core::double::*}(z);
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(n);
   core::num n_i = n.{core::num::%}(i);
   core::double n_d = n.{core::num::%}(d);
@@ -154,7 +154,7 @@
   core::double z_y = z.{core::double::%}(y);
   core::double z_z = z.{core::double::%}(z);
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(n);
   core::num n_i = n.{core::num::remainder}(i);
   core::double n_d = n.{core::num::remainder}(d);
@@ -192,7 +192,7 @@
   core::double z_y = z.{core::double::remainder}(y);
   core::double z_z = z.{core::double::remainder}(z);
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n_n = n.{core::num::clamp}(n, n);
   core::num n_i_n = n.{core::num::clamp}(i, n);
   core::num n_d_n = n.{core::num::clamp}(d, n);
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
index c539802..d52aac2 100644
--- a/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(n);
   core::num n_i = n.{core::num::+}(i);
   core::double n_d = n.{core::num::+}(d);
@@ -40,7 +40,7 @@
   core::double z_y = z.{core::double::+}(y);
   core::double z_z = z.{core::double::+}(z);
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(n);
   core::num n_i = n.{core::num::-}(i);
   core::double n_d = n.{core::num::-}(d);
@@ -78,7 +78,7 @@
   core::double z_y = z.{core::double::-}(y);
   core::double z_z = z.{core::double::-}(z);
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(n);
   core::num n_i = n.{core::num::*}(i);
   core::double n_d = n.{core::num::*}(d);
@@ -116,7 +116,7 @@
   core::double z_y = z.{core::double::*}(y);
   core::double z_z = z.{core::double::*}(z);
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(n);
   core::num n_i = n.{core::num::%}(i);
   core::double n_d = n.{core::num::%}(d);
@@ -154,7 +154,7 @@
   core::double z_y = z.{core::double::%}(y);
   core::double z_z = z.{core::double::%}(z);
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(n);
   core::num n_i = n.{core::num::remainder}(i);
   core::double n_d = n.{core::num::remainder}(d);
@@ -192,7 +192,7 @@
   core::double z_y = z.{core::double::remainder}(y);
   core::double z_z = z.{core::double::remainder}(z);
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n_n = n.{core::num::clamp}(n, n);
   core::num n_i_n = n.{core::num::clamp}(i, n);
   core::num n_d_n = n.{core::num::clamp}(d, n);
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
index c539802..d52aac2 100644
--- a/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(n);
   core::num n_i = n.{core::num::+}(i);
   core::double n_d = n.{core::num::+}(d);
@@ -40,7 +40,7 @@
   core::double z_y = z.{core::double::+}(y);
   core::double z_z = z.{core::double::+}(z);
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(n);
   core::num n_i = n.{core::num::-}(i);
   core::double n_d = n.{core::num::-}(d);
@@ -78,7 +78,7 @@
   core::double z_y = z.{core::double::-}(y);
   core::double z_z = z.{core::double::-}(z);
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(n);
   core::num n_i = n.{core::num::*}(i);
   core::double n_d = n.{core::num::*}(d);
@@ -116,7 +116,7 @@
   core::double z_y = z.{core::double::*}(y);
   core::double z_z = z.{core::double::*}(z);
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(n);
   core::num n_i = n.{core::num::%}(i);
   core::double n_d = n.{core::num::%}(d);
@@ -154,7 +154,7 @@
   core::double z_y = z.{core::double::%}(y);
   core::double z_z = z.{core::double::%}(z);
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(n);
   core::num n_i = n.{core::num::remainder}(i);
   core::double n_d = n.{core::num::remainder}(d);
@@ -192,7 +192,7 @@
   core::double z_y = z.{core::double::remainder}(y);
   core::double z_z = z.{core::double::remainder}(z);
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n_n = n.{core::num::clamp}(n, n);
   core::num n_i_n = n.{core::num::clamp}(i, n);
   core::num n_d_n = n.{core::num::clamp}(d, n);
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.outline.expect
index e9834e0..bfe6473 100644
--- a/pkg/front_end/testcases/nnbd/numbers.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
   ;
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
   ;
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
   ;
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
   ;
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
   ;
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
index c539802..d52aac2 100644
--- a/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(n);
   core::num n_i = n.{core::num::+}(i);
   core::double n_d = n.{core::num::+}(d);
@@ -40,7 +40,7 @@
   core::double z_y = z.{core::double::+}(y);
   core::double z_z = z.{core::double::+}(z);
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(n);
   core::num n_i = n.{core::num::-}(i);
   core::double n_d = n.{core::num::-}(d);
@@ -78,7 +78,7 @@
   core::double z_y = z.{core::double::-}(y);
   core::double z_z = z.{core::double::-}(z);
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(n);
   core::num n_i = n.{core::num::*}(i);
   core::double n_d = n.{core::num::*}(d);
@@ -116,7 +116,7 @@
   core::double z_y = z.{core::double::*}(y);
   core::double z_z = z.{core::double::*}(z);
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(n);
   core::num n_i = n.{core::num::%}(i);
   core::double n_d = n.{core::num::%}(d);
@@ -154,7 +154,7 @@
   core::double z_y = z.{core::double::%}(y);
   core::double z_z = z.{core::double::%}(z);
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(n);
   core::num n_i = n.{core::num::remainder}(i);
   core::double n_d = n.{core::num::remainder}(d);
@@ -192,7 +192,7 @@
   core::double z_y = z.{core::double::remainder}(y);
   core::double z_z = z.{core::double::remainder}(z);
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n_n = n.{core::num::clamp}(n, n);
   core::num n_i_n = n.{core::num::clamp}(i, n);
   core::num n_d_n = n.{core::num::clamp}(d, n);
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
index dd84efc..cdda24f 100644
--- a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
@@ -551,7 +551,7 @@
 
 static method f<T extends core::Object? = dynamic>() → self::f::T%
   return throw "Unsupported";
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(self::f<core::num>());
   core::int n_i = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n + f();
@@ -633,7 +633,7 @@
   Z z_z = z + f();
             ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(self::f<core::num>());
   core::int n_i = let final Never #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n - f();
@@ -715,7 +715,7 @@
   Z z_z = z - f();
             ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(self::f<core::num>());
   core::int n_i = let final Never #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n * f();
@@ -797,7 +797,7 @@
   Z z_z = z * f();
             ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(self::f<core::num>());
   core::int n_i = let final Never #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n % f();
@@ -879,7 +879,7 @@
   Z z_z = z % f();
             ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(self::f<core::num>());
   core::int n_i = let final Never #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.remainder(f());
@@ -961,7 +961,7 @@
   Z z_z = z.remainder(f());
             ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
   core::int n_i = let final Never #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.clamp(f(), f());
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
index dd84efc..cdda24f 100644
--- a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
@@ -551,7 +551,7 @@
 
 static method f<T extends core::Object? = dynamic>() → self::f::T%
   return throw "Unsupported";
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(self::f<core::num>());
   core::int n_i = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n + f();
@@ -633,7 +633,7 @@
   Z z_z = z + f();
             ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(self::f<core::num>());
   core::int n_i = let final Never #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n - f();
@@ -715,7 +715,7 @@
   Z z_z = z - f();
             ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(self::f<core::num>());
   core::int n_i = let final Never #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n * f();
@@ -797,7 +797,7 @@
   Z z_z = z * f();
             ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(self::f<core::num>());
   core::int n_i = let final Never #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n % f();
@@ -879,7 +879,7 @@
   Z z_z = z % f();
             ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(self::f<core::num>());
   core::int n_i = let final Never #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.remainder(f());
@@ -961,7 +961,7 @@
   Z z_z = z.remainder(f());
             ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
   core::int n_i = let final Never #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.clamp(f(), f());
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
index dd84efc..cdda24f 100644
--- a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
@@ -551,7 +551,7 @@
 
 static method f<T extends core::Object? = dynamic>() → self::f::T%
   return throw "Unsupported";
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(self::f<core::num>());
   core::int n_i = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n + f();
@@ -633,7 +633,7 @@
   Z z_z = z + f();
             ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(self::f<core::num>());
   core::int n_i = let final Never #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n - f();
@@ -715,7 +715,7 @@
   Z z_z = z - f();
             ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(self::f<core::num>());
   core::int n_i = let final Never #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n * f();
@@ -797,7 +797,7 @@
   Z z_z = z * f();
             ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(self::f<core::num>());
   core::int n_i = let final Never #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n % f();
@@ -879,7 +879,7 @@
   Z z_z = z % f();
             ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(self::f<core::num>());
   core::int n_i = let final Never #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.remainder(f());
@@ -961,7 +961,7 @@
   Z z_z = z.remainder(f());
             ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
   core::int n_i = let final Never #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.clamp(f(), f());
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.outline.expect
index 8160ab1..f479d6e 100644
--- a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.outline.expect
@@ -4,17 +4,17 @@
 
 static method f<T extends core::Object? = dynamic>() → self::f::T%
   ;
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
   ;
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
   ;
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
   ;
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
   ;
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
   ;
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
index dd84efc..cdda24f 100644
--- a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
@@ -551,7 +551,7 @@
 
 static method f<T extends core::Object? = dynamic>() → self::f::T%
   return throw "Unsupported";
-static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
   core::num n_n = n.{core::num::+}(self::f<core::num>());
   core::int n_i = let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n + f();
@@ -633,7 +633,7 @@
   Z z_z = z + f();
             ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
   core::num n_n = n.{core::num::-}(self::f<core::num>());
   core::int n_i = let final Never #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n - f();
@@ -715,7 +715,7 @@
   Z z_z = z - f();
             ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
   core::num n_n = n.{core::num::*}(self::f<core::num>());
   core::int n_i = let final Never #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n * f();
@@ -797,7 +797,7 @@
   Z z_z = z * f();
             ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
   core::num n_n = n.{core::num::%}(self::f<core::num>());
   core::int n_i = let final Never #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n % f();
@@ -879,7 +879,7 @@
   Z z_z = z % f();
             ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
   core::num n_n = n.{core::num::remainder}(self::f<core::num>());
   core::int n_i = let final Never #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.remainder(f());
@@ -961,7 +961,7 @@
   Z z_z = z.remainder(f());
             ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} Never;
 }
-static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
   core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
   core::int n_i = let final Never #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
   int n_i = n.clamp(f(), f());
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
index 6721314..661f38d 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.expect
@@ -38,7 +38,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   static factory •() → self::C1
     let dynamic #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
 }
-class C2<X extends core::int = core::int> extends core::Object implements self::C1 {
+class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
index 8c716e6..1ac0b20 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   static factory •() → self::C1
     let Never #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
 }
-class C2<X extends core::int = core::int> extends core::Object implements self::C1 {
+class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
index 6721314..661f38d 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
@@ -38,7 +38,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   static factory •() → self::C1
     let dynamic #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
 }
-class C2<X extends core::int = core::int> extends core::Object implements self::C1 {
+class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
index ece5e4e..c5c7f90 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.outline.expect
@@ -38,7 +38,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     ;
 }
@@ -66,7 +66,7 @@
   static factory •() → self::C1
     let dynamic #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
 }
-class C2<X extends core::int = core::int> extends core::Object implements self::C1 {
+class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
index 8c716e6..1ac0b20 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
@@ -38,7 +38,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::num = core::num> extends core::Object {
+class A<X extends core::num> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -66,7 +66,7 @@
   static factory •() → self::C1
     let Never #redirecting_factory = self::C2::• in let core::int? #typeArg0 = null in invalid-expression;
 }
-class C2<X extends core::int = core::int> extends core::Object implements self::C1 {
+class C2<X extends core::int> extends core::Object implements self::C1 {
   synthetic constructor •() → self::C2<self::C2::X>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
index 32a8f57..631f443 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
@@ -52,7 +52,7 @@
 import "dart:_internal";
 
 @#C1
-class Class<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::int a;
   final field test::Class::T b;
   const constructor constConstructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
index 32a8f57..631f443 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
@@ -52,7 +52,7 @@
 import "dart:_internal";
 
 @#C1
-class Class<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::int a;
   final field test::Class::T b;
   const constructor constConstructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
index 32a8f57..631f443 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
@@ -52,7 +52,7 @@
 import "dart:_internal";
 
 @#C1
-class Class<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::int a;
   final field test::Class::T b;
   const constructor constConstructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.outline.expect
index f5a5f71..079de64 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.outline.expect
@@ -14,7 +14,7 @@
 import "dart:_internal";
 
 @_in::patch
-class Class<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::int a;
   final field self2::Class::T b;
   const constructor constConstructor(core::int a, self2::Class::T b) → self2::Class<self2::Class::T>
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
index 32a8f57..631f443 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
@@ -52,7 +52,7 @@
 import "dart:_internal";
 
 @#C1
-class Class<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::int a;
   final field test::Class::T b;
   const constructor constConstructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect
index d067529..5612a60 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.expect
@@ -143,7 +143,7 @@
     : self::Class::field = value as{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field self::ClassWithBound::T field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect
index d067529..5612a60 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.strong.transformed.expect
@@ -143,7 +143,7 @@
     : self::Class::field = value as{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field self::ClassWithBound::T field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect
index 9abe043..ff4ef6e 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.expect
@@ -135,7 +135,7 @@
     : self::Class::field = value as{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field self::ClassWithBound::T field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.outline.expect
index 391e7e9..b3e41d5 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.outline.expect
@@ -8,7 +8,7 @@
     : self::Class::field = value as{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field self::ClassWithBound::T field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = self::three as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect
index 9abe043..ff4ef6e 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.transformed.expect
@@ -135,7 +135,7 @@
     : self::Class::field = value as{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field self::ClassWithBound::T field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect
index dd71e24..c131260 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.expect
@@ -8,7 +8,7 @@
     : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::bool field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect
index dd71e24..c131260 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::bool field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect
index da6412f..d959fa2 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.expect
@@ -8,7 +8,7 @@
     : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::bool field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.outline.expect
index 90a132b..ba55100 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.outline.expect
@@ -8,7 +8,7 @@
     : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::bool field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = self::three is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect
index da6412f..d959fa2 100644
--- a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
     ;
 }
-class ClassWithBound<T extends core::num = core::num> extends core::Object /*hasConstConstructor*/  {
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
   final field core::bool field;
   const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
     : self::ClassWithBound::field = (#C1) is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.expect
index ac1c56b..a39f6c2 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.expect
@@ -21,7 +21,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?> extends core::Object {
+class A<T extends core::Object?> extends core::Object {
   static field core::int x = null;
   static field core::int? y = null;
   late static field core::int z;
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.transformed.expect
index ac1c56b..a39f6c2 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?> extends core::Object {
+class A<T extends core::Object?> extends core::Object {
   static field core::int x = null;
   static field core::int? y = null;
   late static field core::int z;
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
index ac1c56b..a39f6c2 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
@@ -21,7 +21,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?> extends core::Object {
+class A<T extends core::Object?> extends core::Object {
   static field core::int x = null;
   static field core::int? y = null;
   late static field core::int z;
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.outline.expect
index 5f5e178..088b4c8 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.outline.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?> extends core::Object {
+class A<T extends core::Object?> extends core::Object {
   static field core::int x;
   static field core::int? y;
   late static field core::int z;
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
index ac1c56b..a39f6c2 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?> extends core::Object {
+class A<T extends core::Object?> extends core::Object {
   static field core::int x = null;
   static field core::int? y = null;
   late static field core::int z;
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect
index afd873e..7dda588 100644
--- a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+class A<T extends core::Object?, S extends core::Object> extends core::Object {
   synthetic constructor •() → self::A<self::A::T%, self::A::S>
     : super core::Object::•()
     ;
-  method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+  method hest<generic-covariant-impl X extends self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
     return null;
-  method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+  method fisk<generic-covariant-impl X extends self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
     return null;
-  method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+  method mus<X extends core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
     return null;
 }
-static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+static method foo<T extends core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
   return null;
-static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+static method bar<T extends core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
   return null;
 static method baz(core::int? x, core::int y) → dynamic {
   self::foo<core::int?, core::List<core::int?>>(x);
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect
index afd873e..7dda588 100644
--- a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+class A<T extends core::Object?, S extends core::Object> extends core::Object {
   synthetic constructor •() → self::A<self::A::T%, self::A::S>
     : super core::Object::•()
     ;
-  method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+  method hest<generic-covariant-impl X extends self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
     return null;
-  method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+  method fisk<generic-covariant-impl X extends self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
     return null;
-  method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+  method mus<X extends core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
     return null;
 }
-static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+static method foo<T extends core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
   return null;
-static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+static method bar<T extends core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
   return null;
 static method baz(core::int? x, core::int y) → dynamic {
   self::foo<core::int?, core::List<core::int?>>(x);
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.expect
index afd873e..7dda588 100644
--- a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+class A<T extends core::Object?, S extends core::Object> extends core::Object {
   synthetic constructor •() → self::A<self::A::T%, self::A::S>
     : super core::Object::•()
     ;
-  method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+  method hest<generic-covariant-impl X extends self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
     return null;
-  method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+  method fisk<generic-covariant-impl X extends self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
     return null;
-  method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+  method mus<X extends core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
     return null;
 }
-static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+static method foo<T extends core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
   return null;
-static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+static method bar<T extends core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
   return null;
 static method baz(core::int? x, core::int y) → dynamic {
   self::foo<core::int?, core::List<core::int?>>(x);
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.outline.expect
index afffc19..091ebb6 100644
--- a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.outline.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+class A<T extends core::Object?, S extends core::Object> extends core::Object {
   synthetic constructor •() → self::A<self::A::T%, self::A::S>
     ;
-  method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+  method hest<generic-covariant-impl X extends self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
     ;
-  method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+  method fisk<generic-covariant-impl X extends self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
     ;
-  method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+  method mus<X extends core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
     ;
 }
-static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+static method foo<T extends core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
   ;
-static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+static method bar<T extends core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
   ;
 static method baz(core::int? x, core::int y) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.transformed.expect
index afd873e..7dda588 100644
--- a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+class A<T extends core::Object?, S extends core::Object> extends core::Object {
   synthetic constructor •() → self::A<self::A::T%, self::A::S>
     : super core::Object::•()
     ;
-  method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+  method hest<generic-covariant-impl X extends self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
     return null;
-  method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+  method fisk<generic-covariant-impl X extends self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
     return null;
-  method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+  method mus<X extends core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
     return null;
 }
-static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+static method foo<T extends core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
   return null;
-static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+static method bar<T extends core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
   return null;
 static method baz(core::int? x, core::int y) → dynamic {
   self::foo<core::int?, core::List<core::int?>>(x);
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect
index 98725b8..5537cc3 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect
@@ -533,7 +533,7 @@
     : super core::Object::•()
     ;
 }
-class Foo3a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>> extends core::Object {
+class Foo3a<X extends (self::A<Never>) → self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self::Foo3a<self::Foo3a::X>
     : super core::Object::•()
     ;
@@ -543,12 +543,12 @@
     : super core::Object::•()
     ;
 }
-class B<X extends core::int = core::int> extends core::Object {
+class B<X extends core::int> extends core::Object {
   synthetic constructor •() → self::B<self::B::X>
     : super core::Object::•()
     ;
 }
-class Bar3<X extends self::B<core::num> = self::B<core::num>> extends core::Object {
+class Bar3<X extends self::B<core::num>> extends core::Object {
   synthetic constructor •() → self::Bar3<self::Bar3::X>
     : super core::Object::•()
     ;
@@ -560,7 +560,7 @@
 }
 static method foo1a((self::A<Never>) → self::A<dynamic> x) → dynamic {}
 static method foo1b((self::A<Never>) → self::A<dynamic> x) → dynamic {}
-static method foo2a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → dynamic {}
+static method foo2a<X extends (self::A<Never>) → self::A<dynamic>>() → dynamic {}
 static method foo2b<X extends (self::A<Never>) → self::A<dynamic> = dynamic>() → dynamic {}
 static method foo4a() → (self::A<Never>) → self::A<dynamic>
   return throw 42;
@@ -573,7 +573,7 @@
   for ((self::A<Never>) → self::A<dynamic> x in <(self::A<Never>) → self::A<dynamic>>[]) {
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -584,7 +584,7 @@
   for ((self::A<Never>) → self::A<dynamic> x in <(self::A<Never>) → self::A<dynamic>>[]) {
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -593,7 +593,7 @@
 static method foo7a([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method foo7b([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method bar1(self::B<core::num> x) → dynamic {}
-static method bar2<X extends self::B<core::num> = self::B<core::num>>() → dynamic {}
+static method bar2<X extends self::B<core::num>>() → dynamic {}
 static method bar4() → self::B<core::num>
   return throw 42;
 static method bar5({required self::B<core::num> x = #C1}) → dynamic {}
@@ -602,7 +602,7 @@
   for (self::B<core::num> x in <self::B<core::num>>[]) {
   }
   function barBar1(self::B<core::num> x) → Null {}
-  function barBar2<X extends self::B<core::num> = self::B<core::num>>() → Null {}
+  function barBar2<X extends self::B<core::num>>() → Null {}
   function barBar4() → self::B<core::num>
     return throw 42;
   function barBar5({required self::B<core::num> x = #C1}) → Null {}
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect
index edb2e83..3a904fc 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect
@@ -533,7 +533,7 @@
     : super core::Object::•()
     ;
 }
-class Foo3a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>> extends core::Object {
+class Foo3a<X extends (self::A<Never>) → self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self::Foo3a<self::Foo3a::X>
     : super core::Object::•()
     ;
@@ -543,12 +543,12 @@
     : super core::Object::•()
     ;
 }
-class B<X extends core::int = core::int> extends core::Object {
+class B<X extends core::int> extends core::Object {
   synthetic constructor •() → self::B<self::B::X>
     : super core::Object::•()
     ;
 }
-class Bar3<X extends self::B<core::num> = self::B<core::num>> extends core::Object {
+class Bar3<X extends self::B<core::num>> extends core::Object {
   synthetic constructor •() → self::Bar3<self::Bar3::X>
     : super core::Object::•()
     ;
@@ -560,7 +560,7 @@
 }
 static method foo1a((self::A<Never>) → self::A<dynamic> x) → dynamic {}
 static method foo1b((self::A<Never>) → self::A<dynamic> x) → dynamic {}
-static method foo2a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → dynamic {}
+static method foo2a<X extends (self::A<Never>) → self::A<dynamic>>() → dynamic {}
 static method foo2b<X extends (self::A<Never>) → self::A<dynamic> = dynamic>() → dynamic {}
 static method foo4a() → (self::A<Never>) → self::A<dynamic>
   return throw 42;
@@ -578,7 +578,7 @@
     }
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -594,7 +594,7 @@
     }
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -603,7 +603,7 @@
 static method foo7a([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method foo7b([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method bar1(self::B<core::num> x) → dynamic {}
-static method bar2<X extends self::B<core::num> = self::B<core::num>>() → dynamic {}
+static method bar2<X extends self::B<core::num>>() → dynamic {}
 static method bar4() → self::B<core::num>
   return throw 42;
 static method bar5({required self::B<core::num> x = #C1}) → dynamic {}
@@ -617,7 +617,7 @@
     }
   }
   function barBar1(self::B<core::num> x) → Null {}
-  function barBar2<X extends self::B<core::num> = self::B<core::num>>() → Null {}
+  function barBar2<X extends self::B<core::num>>() → Null {}
   function barBar4() → self::B<core::num>
     return throw 42;
   function barBar5({required self::B<core::num> x = #C1}) → Null {}
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect
index 98725b8..5537cc3 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect
@@ -533,7 +533,7 @@
     : super core::Object::•()
     ;
 }
-class Foo3a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>> extends core::Object {
+class Foo3a<X extends (self::A<Never>) → self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self::Foo3a<self::Foo3a::X>
     : super core::Object::•()
     ;
@@ -543,12 +543,12 @@
     : super core::Object::•()
     ;
 }
-class B<X extends core::int = core::int> extends core::Object {
+class B<X extends core::int> extends core::Object {
   synthetic constructor •() → self::B<self::B::X>
     : super core::Object::•()
     ;
 }
-class Bar3<X extends self::B<core::num> = self::B<core::num>> extends core::Object {
+class Bar3<X extends self::B<core::num>> extends core::Object {
   synthetic constructor •() → self::Bar3<self::Bar3::X>
     : super core::Object::•()
     ;
@@ -560,7 +560,7 @@
 }
 static method foo1a((self::A<Never>) → self::A<dynamic> x) → dynamic {}
 static method foo1b((self::A<Never>) → self::A<dynamic> x) → dynamic {}
-static method foo2a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → dynamic {}
+static method foo2a<X extends (self::A<Never>) → self::A<dynamic>>() → dynamic {}
 static method foo2b<X extends (self::A<Never>) → self::A<dynamic> = dynamic>() → dynamic {}
 static method foo4a() → (self::A<Never>) → self::A<dynamic>
   return throw 42;
@@ -573,7 +573,7 @@
   for ((self::A<Never>) → self::A<dynamic> x in <(self::A<Never>) → self::A<dynamic>>[]) {
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -584,7 +584,7 @@
   for ((self::A<Never>) → self::A<dynamic> x in <(self::A<Never>) → self::A<dynamic>>[]) {
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -593,7 +593,7 @@
 static method foo7a([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method foo7b([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method bar1(self::B<core::num> x) → dynamic {}
-static method bar2<X extends self::B<core::num> = self::B<core::num>>() → dynamic {}
+static method bar2<X extends self::B<core::num>>() → dynamic {}
 static method bar4() → self::B<core::num>
   return throw 42;
 static method bar5({required self::B<core::num> x = #C1}) → dynamic {}
@@ -602,7 +602,7 @@
   for (self::B<core::num> x in <self::B<core::num>>[]) {
   }
   function barBar1(self::B<core::num> x) → Null {}
-  function barBar2<X extends self::B<core::num> = self::B<core::num>>() → Null {}
+  function barBar2<X extends self::B<core::num>>() → Null {}
   function barBar4() → self::B<core::num>
     return throw 42;
   function barBar5({required self::B<core::num> x = #C1}) → Null {}
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect
index 1d220b5..155fe0cd 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect
@@ -236,7 +236,7 @@
   synthetic constructor •() → self::A<self::A::X%>
     ;
 }
-class Foo3a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>> extends core::Object {
+class Foo3a<X extends (self::A<Never>) → self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self::Foo3a<self::Foo3a::X>
     ;
 }
@@ -244,11 +244,11 @@
   synthetic constructor •() → self::Foo3b<self::Foo3b::X>
     ;
 }
-class B<X extends core::int = core::int> extends core::Object {
+class B<X extends core::int> extends core::Object {
   synthetic constructor •() → self::B<self::B::X>
     ;
 }
-class Bar3<X extends self::B<core::num> = self::B<core::num>> extends core::Object {
+class Bar3<X extends self::B<core::num>> extends core::Object {
   synthetic constructor •() → self::Bar3<self::Bar3::X>
     ;
 }
@@ -260,7 +260,7 @@
   ;
 static method foo1b((self::A<Never>) → self::A<dynamic> x) → dynamic
   ;
-static method foo2a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → dynamic
+static method foo2a<X extends (self::A<Never>) → self::A<dynamic>>() → dynamic
   ;
 static method foo2b<X extends (self::A<Never>) → self::A<dynamic> = dynamic>() → dynamic
   ;
@@ -282,7 +282,7 @@
   ;
 static method bar1(self::B<core::num> x) → dynamic
   ;
-static method bar2<X extends self::B<core::num> = self::B<core::num>>() → dynamic
+static method bar2<X extends self::B<core::num>>() → dynamic
   ;
 static method bar4() → self::B<core::num>
   ;
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect
index edb2e83..3a904fc 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect
@@ -533,7 +533,7 @@
     : super core::Object::•()
     ;
 }
-class Foo3a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>> extends core::Object {
+class Foo3a<X extends (self::A<Never>) → self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self::Foo3a<self::Foo3a::X>
     : super core::Object::•()
     ;
@@ -543,12 +543,12 @@
     : super core::Object::•()
     ;
 }
-class B<X extends core::int = core::int> extends core::Object {
+class B<X extends core::int> extends core::Object {
   synthetic constructor •() → self::B<self::B::X>
     : super core::Object::•()
     ;
 }
-class Bar3<X extends self::B<core::num> = self::B<core::num>> extends core::Object {
+class Bar3<X extends self::B<core::num>> extends core::Object {
   synthetic constructor •() → self::Bar3<self::Bar3::X>
     : super core::Object::•()
     ;
@@ -560,7 +560,7 @@
 }
 static method foo1a((self::A<Never>) → self::A<dynamic> x) → dynamic {}
 static method foo1b((self::A<Never>) → self::A<dynamic> x) → dynamic {}
-static method foo2a<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → dynamic {}
+static method foo2a<X extends (self::A<Never>) → self::A<dynamic>>() → dynamic {}
 static method foo2b<X extends (self::A<Never>) → self::A<dynamic> = dynamic>() → dynamic {}
 static method foo4a() → (self::A<Never>) → self::A<dynamic>
   return throw 42;
@@ -578,7 +578,7 @@
     }
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -594,7 +594,7 @@
     }
   }
   function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
-  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic> = (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
   function fooFoo4() → (self::A<Never>) → self::A<dynamic>
     return throw 42;
   function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
@@ -603,7 +603,7 @@
 static method foo7a([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method foo7b([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
 static method bar1(self::B<core::num> x) → dynamic {}
-static method bar2<X extends self::B<core::num> = self::B<core::num>>() → dynamic {}
+static method bar2<X extends self::B<core::num>>() → dynamic {}
 static method bar4() → self::B<core::num>
   return throw 42;
 static method bar5({required self::B<core::num> x = #C1}) → dynamic {}
@@ -617,7 +617,7 @@
     }
   }
   function barBar1(self::B<core::num> x) → Null {}
-  function barBar2<X extends self::B<core::num> = self::B<core::num>>() → Null {}
+  function barBar2<X extends self::B<core::num>>() → Null {}
   function barBar4() → self::B<core::num>
     return throw 42;
   function barBar5({required self::B<core::num> x = #C1}) → Null {}
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect
index 95d9965..200bf55 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.expect
@@ -54,7 +54,7 @@
 }
 static method functionContext(() → core::int f) → dynamic {}
 static method nullableFunctionContext(() →? core::int f) → dynamic {}
-static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
+static method foo<T extends self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
   self::functionContext(let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
   functionContext(null as C?); // Error.
                        ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
@@ -80,7 +80,7 @@
   nullableFunctionContext(nt); // Error.
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
-static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
+static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
   self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
   self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
   self::functionContext(let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
index 116b424..ea7c975 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
@@ -54,7 +54,7 @@
 }
 static method functionContext(() → core::int f) → dynamic {}
 static method nullableFunctionContext(() →? core::int f) → dynamic {}
-static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
+static method foo<T extends self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
   self::functionContext(let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
   functionContext(null as C?); // Error.
                        ^" in let Null #t2 = null in #t2.==(null) ?{() → core::int} #t2 as{TypeError} () → core::int : #t2{() → core::int});
@@ -80,7 +80,7 @@
   nullableFunctionContext(nt); // Error.
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
-static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
+static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
   self::functionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
   self::nullableFunctionContext(let final self::C #t11 = c in #t11.==(null) ?{() → core::int} null : #t11.{self::C::call});
   self::functionContext(let final Never #t12 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
index 95d9965..200bf55 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
@@ -54,7 +54,7 @@
 }
 static method functionContext(() → core::int f) → dynamic {}
 static method nullableFunctionContext(() →? core::int f) → dynamic {}
-static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
+static method foo<T extends self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
   self::functionContext(let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
   functionContext(null as C?); // Error.
                        ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
@@ -80,7 +80,7 @@
   nullableFunctionContext(nt); // Error.
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
-static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
+static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
   self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
   self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
   self::functionContext(let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.outline.expect
index bb20d27..cb5a9ee 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.outline.expect
@@ -12,9 +12,9 @@
   ;
 static method nullableFunctionContext(() →? core::int f) → dynamic
   ;
-static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic
+static method foo<T extends self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic
   ;
-static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic
+static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
index e84755e..651b955 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
@@ -54,7 +54,7 @@
 }
 static method functionContext(() → core::int f) → dynamic {}
 static method nullableFunctionContext(() →? core::int f) → dynamic {}
-static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
+static method foo<T extends self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
   self::functionContext(let final Never #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
   functionContext(null as C?); // Error.
                        ^" in null);
@@ -80,7 +80,7 @@
   nullableFunctionContext(nt); // Error.
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
-static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
+static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
   self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
   self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
   self::functionContext(let final Never #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
diff --git a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.expect
index 4db6f6e..9f2387d 100644
--- a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object = core::Object, Y extends core::Object? = core::Object?> extends core::Object {
+class A<X extends core::Object, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::A<self::A::X, self::A::Y%>
     : super core::Object::•()
     ;
@@ -13,7 +13,7 @@
   method baz() → self::A::Y%
     return self::never();
 }
-class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?> extends core::Object {
+class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::B<self::B::X, self::B::Y%>
     : super core::Object::•()
     ;
@@ -34,13 +34,13 @@
 static method never() → Never
   return throw "Never";
 static method main() → dynamic {
-  function fun1<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → X
+  function fun1<X extends core::Object, Y extends core::Object?>() → X
     return self::never();
-  function fun2<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → Y%
+  function fun2<X extends core::Object, Y extends core::Object?>() → Y%
     return self::never();
-  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → X
+  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → X
     return self::never();
-  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → Y%
+  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → Y%
     return self::never();
   function fun5<X extends core::List<Y%>? = core::List<dynamic>?, Y extends core::List<X%>? = core::List<dynamic>?>() → X%
     return self::never();
diff --git a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.transformed.expect
index 4db6f6e..9f2387d 100644
--- a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object = core::Object, Y extends core::Object? = core::Object?> extends core::Object {
+class A<X extends core::Object, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::A<self::A::X, self::A::Y%>
     : super core::Object::•()
     ;
@@ -13,7 +13,7 @@
   method baz() → self::A::Y%
     return self::never();
 }
-class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?> extends core::Object {
+class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::B<self::B::X, self::B::Y%>
     : super core::Object::•()
     ;
@@ -34,13 +34,13 @@
 static method never() → Never
   return throw "Never";
 static method main() → dynamic {
-  function fun1<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → X
+  function fun1<X extends core::Object, Y extends core::Object?>() → X
     return self::never();
-  function fun2<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → Y%
+  function fun2<X extends core::Object, Y extends core::Object?>() → Y%
     return self::never();
-  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → X
+  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → X
     return self::never();
-  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → Y%
+  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → Y%
     return self::never();
   function fun5<X extends core::List<Y%>? = core::List<dynamic>?, Y extends core::List<X%>? = core::List<dynamic>?>() → X%
     return self::never();
diff --git a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.expect b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.expect
index 8762f10..5992af3 100644
--- a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class A<X extends core::Object = core::Object, Y extends core::Object? = core::Object?> extends core::Object {
+class A<X extends core::Object, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::A<self::A::X, self::A::Y%>
     : super core::Object::•()
     ;
@@ -14,7 +14,7 @@
   method baz() → self::A::Y%
     return let final Never #t2 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
 }
-class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?> extends core::Object {
+class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::B<self::B::X, self::B::Y%>
     : super core::Object::•()
     ;
@@ -35,13 +35,13 @@
 static method never() → Never
   return throw "Never";
 static method main() → dynamic {
-  function fun1<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → X
+  function fun1<X extends core::Object, Y extends core::Object?>() → X
     return let final Never #t3 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  function fun2<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → Y%
+  function fun2<X extends core::Object, Y extends core::Object?>() → Y%
     return let final Never #t4 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → X
+  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → X
     return let final Never #t5 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → Y%
+  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → Y%
     return let final Never #t6 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   function fun5<X extends core::List<Y%>? = core::List<dynamic>?, Y extends core::List<X%>? = core::List<dynamic>?>() → X%
     return let final Never #t7 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
diff --git a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.outline.expect
index 9c418ba..e50ba48 100644
--- a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object = core::Object, Y extends core::Object? = core::Object?> extends core::Object {
+class A<X extends core::Object, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::A<self::A::X, self::A::Y%>
     ;
   method foo() → self::A::X
@@ -12,7 +12,7 @@
   method baz() → self::A::Y%
     ;
 }
-class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?> extends core::Object {
+class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::B<self::B::X, self::B::Y%>
     ;
   method foo(generic-covariant-impl self::B::X x, generic-covariant-impl self::B::Y% y) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.transformed.expect
index 8762f10..5992af3 100644
--- a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-class A<X extends core::Object = core::Object, Y extends core::Object? = core::Object?> extends core::Object {
+class A<X extends core::Object, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::A<self::A::X, self::A::Y%>
     : super core::Object::•()
     ;
@@ -14,7 +14,7 @@
   method baz() → self::A::Y%
     return let final Never #t2 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
 }
-class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?> extends core::Object {
+class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object?> extends core::Object {
   synthetic constructor •() → self::B<self::B::X, self::B::Y%>
     : super core::Object::•()
     ;
@@ -35,13 +35,13 @@
 static method never() → Never
   return throw "Never";
 static method main() → dynamic {
-  function fun1<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → X
+  function fun1<X extends core::Object, Y extends core::Object?>() → X
     return let final Never #t3 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  function fun2<X extends core::Object = core::Object, Y extends core::Object? = core::Object?>() → Y%
+  function fun2<X extends core::Object, Y extends core::Object?>() → Y%
     return let final Never #t4 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → X
+  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → X
     return let final Never #t5 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object? = core::Object?>() → Y%
+  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → Y%
     return let final Never #t6 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   function fun5<X extends core::List<Y%>? = core::List<dynamic>?, Y extends core::List<X%>? = core::List<dynamic>?>() → X%
     return let final Never #t7 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
index f315bb6..847ce35 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
@@ -5,11 +5,11 @@
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     : super bou::Class::•()
     ;
-  method method<T extends Null = Null>() → dynamic {}
+  method method<T extends Null>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,10 +32,10 @@
 import self as bou;
 import "dart:core" as core;
 
-class Class<T extends Never = Never> extends core::Object {
+class Class<T extends Never> extends core::Object {
   synthetic constructor •() → bou::Class<bou::Class::T>
     : super core::Object::•()
     ;
-  method method<T extends Never = Never>() → dynamic {}
+  method method<T extends Never>() → dynamic {}
 }
-static method method<T extends Never = Never>() → dynamic {}
+static method method<T extends Never>() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.outline.expect
index e35c602..ca337ee 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.outline.expect
@@ -5,10 +5,10 @@
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     ;
-  method method<T extends Null = Null>() → dynamic
+  method method<T extends Null>() → dynamic
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -30,11 +30,11 @@
 import self as bou;
 import "dart:core" as core;
 
-class Class<T extends Never = Never> extends core::Object {
+class Class<T extends Never> extends core::Object {
   synthetic constructor •() → bou::Class<bou::Class::T>
     ;
-  method method<T extends Never = Never>() → dynamic
+  method method<T extends Never>() → dynamic
     ;
 }
-static method method<T extends Never = Never>() → dynamic
+static method method<T extends Never>() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
index f315bb6..847ce35 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
@@ -5,11 +5,11 @@
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     : super bou::Class::•()
     ;
-  method method<T extends Null = Null>() → dynamic {}
+  method method<T extends Null>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,10 +32,10 @@
 import self as bou;
 import "dart:core" as core;
 
-class Class<T extends Never = Never> extends core::Object {
+class Class<T extends Never> extends core::Object {
   synthetic constructor •() → bou::Class<bou::Class::T>
     : super core::Object::•()
     ;
-  method method<T extends Never = Never>() → dynamic {}
+  method method<T extends Never>() → dynamic {}
 }
-static method method<T extends Never = Never>() → dynamic {}
+static method method<T extends Never>() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
index bdcfe75..90ee935 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
@@ -5,7 +5,7 @@
 import "org-dartlang-testcase:///const_is_lib.dart";
 
 static method main() → dynamic {
-  self::expect(true, (#C1) is{ForNonNullableByDefault} <T extends core::Object? = core::Object?>() → void);
+  self::expect(true, (#C1) is{ForNonNullableByDefault} <T extends core::Object?>() → void);
   self::expect(true, #C2);
   self::expect(true, (#C3) is{ForNonNullableByDefault} <T extends Never = dynamic>() → void);
   self::expect(true, #C2);
@@ -19,11 +19,11 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef fnTypeWithNullableObjectBound = <T extends core::Object? = core::Object?>() → void;
+typedef fnTypeWithNullableObjectBound = <T extends core::Object?>() → void;
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
-static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
+static method fnWithNonNullObjectBound<T extends core::Object>() → void
   return null;
-static method fnWithNullBound<T extends Null = Null>() → void
+static method fnWithNullBound<T extends Null>() → void
   return null;
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.outline.expect
index a26ee06..928c19a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.outline.expect
@@ -12,9 +12,9 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef fnTypeWithNullableObjectBound = <T extends core::Object? = core::Object?>() → void;
+typedef fnTypeWithNullableObjectBound = <T extends core::Object?>() → void;
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
-static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
+static method fnWithNonNullObjectBound<T extends core::Object>() → void
   ;
-static method fnWithNullBound<T extends Null = Null>() → void
+static method fnWithNullBound<T extends Null>() → void
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
index a2670ba..d198bb9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 import "org-dartlang-testcase:///const_is_lib.dart";
 
 static method main() → dynamic {
-  self::expect(true, (#C1) is{ForNonNullableByDefault} <T extends core::Object? = core::Object?>() → void);
+  self::expect(true, (#C1) is{ForNonNullableByDefault} <T extends core::Object?>() → void);
   self::expect(true, #C2);
   self::expect(true, (#C3) is{ForNonNullableByDefault} <T extends Never = dynamic>() → void);
   self::expect(true, #C2);
@@ -19,11 +19,11 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef fnTypeWithNullableObjectBound = <T extends core::Object? = core::Object?>() → void;
+typedef fnTypeWithNullableObjectBound = <T extends core::Object?>() → void;
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
-static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
+static method fnWithNonNullObjectBound<T extends core::Object>() → void
   return null;
-static method fnWithNullBound<T extends Null = Null>() → void
+static method fnWithNullBound<T extends Null>() → void
   return null;
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
index 91bdcec..ab022ec 100644
--- a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class B<T extends flu::A = flu::A> extends core::Object {
+abstract class B<T extends flu::A> extends core::Object {
   synthetic constructor •() → flu::B<flu::B::T>
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class D<T extends flu::A* = flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
+abstract class D<T extends flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.outline.expect
index d6c1469..3bad5bd 100644
--- a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.outline.expect
@@ -32,7 +32,7 @@
   synthetic constructor •() → flu::A
     ;
 }
-abstract class B<T extends flu::A = flu::A> extends core::Object {
+abstract class B<T extends flu::A> extends core::Object {
   synthetic constructor •() → flu::B<flu::B::T>
     ;
 }
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class D<T extends flu::A* = flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
+abstract class D<T extends flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect
index 1009eb9..009be62 100644
--- a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
     : super core::Object::•()
     ;
 }
-abstract class B<T extends flu::A = flu::A> extends core::Object {
+abstract class B<T extends flu::A> extends core::Object {
   synthetic constructor •() → flu::B<flu::B::T>
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-abstract class D<T extends flu::A* = flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
+abstract class D<T extends flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
index 30674ab..71759ac 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.expect
@@ -47,58 +47,58 @@
   abstract method method1a<T extends core::Object? = dynamic>() → void;
   abstract method method1b<T extends core::Object? = dynamic>() → void;
   abstract method method1c<T extends core::Object? = dynamic>() → void;
-  abstract method method2a<T extends core::Object? = core::Object?>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends core::Object? = core::Object?>() → void;
-  abstract method method3a<T extends dynamic = dynamic>() → void;
-  abstract method method3b<T extends dynamic = dynamic>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object = core::Object>() → void;
-  abstract method method4c<T extends core::Object? = core::Object?>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5c<T extends self::Class1? = self::Class1?>() → void;
+  abstract method method2a<T extends core::Object?>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends core::Object?>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object>() → void;
+  abstract method method4c<T extends core::Object?>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1>() → void;
+  abstract method method5c<T extends self::Class1?>() → void;
 }
 abstract class Class2 extends self::Class1 {
   synthetic constructor •() → self::Class2
     : super self::Class1::•()
     ;
   abstract method method1a<T extends core::Object? = dynamic>() → void;
-  abstract method method1b<T extends core::Object? = core::Object?>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object? = dynamic>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object? = dynamic>() → void;
-  abstract method method3b<T extends core::Object? = core::Object?>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object? = core::Object?>() → void;
-  abstract method method4c<T extends core::Object = core::Object>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1? = self::Class1?>() → void;
-  abstract method method5c<T extends self::Class1 = self::Class1>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
 }
 abstract class Class3 extends gen::LegacyClass1 {
   synthetic constructor •() → self::Class3
     : super gen::LegacyClass1::•()
     ;
   abstract method method1a<T extends core::Object? = dynamic>() → void;
-  abstract method method1b<T extends core::Object? = core::Object?>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object? = dynamic>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object? = dynamic>() → void;
-  abstract method method3b<T extends core::Object? = core::Object?>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object? = core::Object?>() → void;
-  abstract method method4c<T extends core::Object = core::Object>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1? = self::Class1?>() → void;
-  abstract method method5c<T extends self::Class1 = self::Class1>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
 }
 static method main() → dynamic {}
 
@@ -116,18 +116,18 @@
   abstract method method1a<T extends core::Object* = dynamic>() → void;
   abstract method method1b<T extends core::Object* = dynamic>() → void;
   abstract method method1c<T extends core::Object* = dynamic>() → void;
-  abstract method method2a<T extends core::Object* = core::Object*>() → void;
-  abstract method method2b<T extends core::Object* = core::Object*>() → void;
-  abstract method method2c<T extends core::Object* = core::Object*>() → void;
-  abstract method method3a<T extends dynamic = dynamic>() → void;
-  abstract method method3b<T extends dynamic = dynamic>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object* = core::Object*>() → void;
-  abstract method method4b<T extends core::Object* = core::Object*>() → void;
-  abstract method method4c<T extends core::Object* = core::Object*>() → void;
-  abstract method method5a<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5b<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5c<T extends self::Class1* = self::Class1*>() → void;
+  abstract method method2a<T extends core::Object*>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends core::Object*>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -144,20 +144,20 @@
     : super self::Class1::•()
     ;
   abstract method method1a<T extends core::Object* = dynamic>() → void;
-  abstract method method1b<T extends core::Object* = core::Object*>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object*>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object* = dynamic>() → void;
-  abstract method method2b<T extends core::Object* = core::Object*>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object* = dynamic>() → void;
-  abstract method method3b<T extends core::Object* = core::Object*>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object* = core::Object*>() → void;
-  abstract method method4b<T extends core::Object* = core::Object*>() → void;
-  abstract method method4c<T extends core::Object* = core::Object*>() → void;
-  abstract method method5a<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5b<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5c<T extends self::Class1* = self::Class1*>() → void;
+  abstract method method3b<T extends core::Object*>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -186,14 +186,14 @@
   abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
   abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
   abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
-  abstract member-signature method method2a<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2a
-  abstract member-signature method method2b<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2b
-  abstract member-signature method method2c<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2c
-  abstract member-signature method method4a<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4a
-  abstract member-signature method method4b<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4b
-  abstract member-signature method method4c<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4c
-  abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
-  abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
-  abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
+  abstract member-signature method method2a<T extends core::Object*>() → void; -> self::Class1::method2a
+  abstract member-signature method method2b<T extends core::Object*>() → void; -> self::Class1::method2b
+  abstract member-signature method method2c<T extends core::Object*>() → void; -> self::Class1::method2c
+  abstract member-signature method method4a<T extends core::Object*>() → void; -> self::Class1::method4a
+  abstract member-signature method method4b<T extends core::Object*>() → void; -> self::Class1::method4b
+  abstract member-signature method method4c<T extends core::Object*>() → void; -> self::Class1::method4c
+  abstract member-signature method method5a<T extends self::Class1*>() → void; -> self::Class1::method5a
+  abstract member-signature method method5b<T extends self::Class1*>() → void; -> self::Class1::method5b
+  abstract member-signature method method5c<T extends self::Class1*>() → void; -> self::Class1::method5c
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.outline.expect
index ab28d4e..11a11bb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.outline.expect
@@ -46,56 +46,56 @@
   abstract method method1a<T extends core::Object? = dynamic>() → void;
   abstract method method1b<T extends core::Object? = dynamic>() → void;
   abstract method method1c<T extends core::Object? = dynamic>() → void;
-  abstract method method2a<T extends core::Object? = core::Object?>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends core::Object? = core::Object?>() → void;
-  abstract method method3a<T extends dynamic = dynamic>() → void;
-  abstract method method3b<T extends dynamic = dynamic>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object = core::Object>() → void;
-  abstract method method4c<T extends core::Object? = core::Object?>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5c<T extends self::Class1? = self::Class1?>() → void;
+  abstract method method2a<T extends core::Object?>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends core::Object?>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object>() → void;
+  abstract method method4c<T extends core::Object?>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1>() → void;
+  abstract method method5c<T extends self::Class1?>() → void;
 }
 abstract class Class2 extends self::Class1 {
   synthetic constructor •() → self::Class2
     ;
   abstract method method1a<T extends core::Object? = dynamic>() → void;
-  abstract method method1b<T extends core::Object? = core::Object?>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object? = dynamic>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object? = dynamic>() → void;
-  abstract method method3b<T extends core::Object? = core::Object?>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object? = core::Object?>() → void;
-  abstract method method4c<T extends core::Object = core::Object>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1? = self::Class1?>() → void;
-  abstract method method5c<T extends self::Class1 = self::Class1>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
 }
 abstract class Class3 extends gen::LegacyClass1 {
   synthetic constructor •() → self::Class3
     ;
   abstract method method1a<T extends core::Object? = dynamic>() → void;
-  abstract method method1b<T extends core::Object? = core::Object?>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object? = dynamic>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object? = dynamic>() → void;
-  abstract method method3b<T extends core::Object? = core::Object?>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object? = core::Object?>() → void;
-  abstract method method4c<T extends core::Object = core::Object>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1? = self::Class1?>() → void;
-  abstract method method5c<T extends self::Class1 = self::Class1>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
 }
 static method main() → dynamic
   ;
@@ -113,18 +113,18 @@
   abstract method method1a<T extends core::Object* = dynamic>() → void;
   abstract method method1b<T extends core::Object* = dynamic>() → void;
   abstract method method1c<T extends core::Object* = dynamic>() → void;
-  abstract method method2a<T extends core::Object* = core::Object*>() → void;
-  abstract method method2b<T extends core::Object* = core::Object*>() → void;
-  abstract method method2c<T extends core::Object* = core::Object*>() → void;
-  abstract method method3a<T extends dynamic = dynamic>() → void;
-  abstract method method3b<T extends dynamic = dynamic>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object* = core::Object*>() → void;
-  abstract method method4b<T extends core::Object* = core::Object*>() → void;
-  abstract method method4c<T extends core::Object* = core::Object*>() → void;
-  abstract method method5a<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5b<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5c<T extends self::Class1* = self::Class1*>() → void;
+  abstract method method2a<T extends core::Object*>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends core::Object*>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -140,20 +140,20 @@
   synthetic constructor •() → gen::LegacyClass2*
     ;
   abstract method method1a<T extends core::Object* = dynamic>() → void;
-  abstract method method1b<T extends core::Object* = core::Object*>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object*>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object* = dynamic>() → void;
-  abstract method method2b<T extends core::Object* = core::Object*>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object* = dynamic>() → void;
-  abstract method method3b<T extends core::Object* = core::Object*>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object* = core::Object*>() → void;
-  abstract method method4b<T extends core::Object* = core::Object*>() → void;
-  abstract method method4c<T extends core::Object* = core::Object*>() → void;
-  abstract method method5a<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5b<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5c<T extends self::Class1* = self::Class1*>() → void;
+  abstract method method3b<T extends core::Object*>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -181,15 +181,15 @@
   abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
   abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
   abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
-  abstract member-signature method method2a<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2a
-  abstract member-signature method method2b<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2b
-  abstract member-signature method method2c<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2c
-  abstract member-signature method method4a<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4a
-  abstract member-signature method method4b<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4b
-  abstract member-signature method method4c<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4c
-  abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
-  abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
-  abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
+  abstract member-signature method method2a<T extends core::Object*>() → void; -> self::Class1::method2a
+  abstract member-signature method method2b<T extends core::Object*>() → void; -> self::Class1::method2b
+  abstract member-signature method method2c<T extends core::Object*>() → void; -> self::Class1::method2c
+  abstract member-signature method method4a<T extends core::Object*>() → void; -> self::Class1::method4a
+  abstract member-signature method method4b<T extends core::Object*>() → void; -> self::Class1::method4b
+  abstract member-signature method method4c<T extends core::Object*>() → void; -> self::Class1::method4c
+  abstract member-signature method method5a<T extends self::Class1*>() → void; -> self::Class1::method5a
+  abstract member-signature method method5b<T extends self::Class1*>() → void; -> self::Class1::method5b
+  abstract member-signature method method5c<T extends self::Class1*>() → void; -> self::Class1::method5c
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
index 30674ab..71759ac 100644
--- a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.transformed.expect
@@ -47,58 +47,58 @@
   abstract method method1a<T extends core::Object? = dynamic>() → void;
   abstract method method1b<T extends core::Object? = dynamic>() → void;
   abstract method method1c<T extends core::Object? = dynamic>() → void;
-  abstract method method2a<T extends core::Object? = core::Object?>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends core::Object? = core::Object?>() → void;
-  abstract method method3a<T extends dynamic = dynamic>() → void;
-  abstract method method3b<T extends dynamic = dynamic>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object = core::Object>() → void;
-  abstract method method4c<T extends core::Object? = core::Object?>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5c<T extends self::Class1? = self::Class1?>() → void;
+  abstract method method2a<T extends core::Object?>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends core::Object?>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object>() → void;
+  abstract method method4c<T extends core::Object?>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1>() → void;
+  abstract method method5c<T extends self::Class1?>() → void;
 }
 abstract class Class2 extends self::Class1 {
   synthetic constructor •() → self::Class2
     : super self::Class1::•()
     ;
   abstract method method1a<T extends core::Object? = dynamic>() → void;
-  abstract method method1b<T extends core::Object? = core::Object?>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object? = dynamic>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object? = dynamic>() → void;
-  abstract method method3b<T extends core::Object? = core::Object?>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object? = core::Object?>() → void;
-  abstract method method4c<T extends core::Object = core::Object>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1? = self::Class1?>() → void;
-  abstract method method5c<T extends self::Class1 = self::Class1>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
 }
 abstract class Class3 extends gen::LegacyClass1 {
   synthetic constructor •() → self::Class3
     : super gen::LegacyClass1::•()
     ;
   abstract method method1a<T extends core::Object? = dynamic>() → void;
-  abstract method method1b<T extends core::Object? = core::Object?>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object? = dynamic>() → void;
-  abstract method method2b<T extends core::Object? = core::Object?>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object? = dynamic>() → void;
-  abstract method method3b<T extends core::Object? = core::Object?>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object = core::Object>() → void;
-  abstract method method4b<T extends core::Object? = core::Object?>() → void;
-  abstract method method4c<T extends core::Object = core::Object>() → void;
-  abstract method method5a<T extends self::Class1 = self::Class1>() → void;
-  abstract method method5b<T extends self::Class1? = self::Class1?>() → void;
-  abstract method method5c<T extends self::Class1 = self::Class1>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
 }
 static method main() → dynamic {}
 
@@ -116,18 +116,18 @@
   abstract method method1a<T extends core::Object* = dynamic>() → void;
   abstract method method1b<T extends core::Object* = dynamic>() → void;
   abstract method method1c<T extends core::Object* = dynamic>() → void;
-  abstract method method2a<T extends core::Object* = core::Object*>() → void;
-  abstract method method2b<T extends core::Object* = core::Object*>() → void;
-  abstract method method2c<T extends core::Object* = core::Object*>() → void;
-  abstract method method3a<T extends dynamic = dynamic>() → void;
-  abstract method method3b<T extends dynamic = dynamic>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object* = core::Object*>() → void;
-  abstract method method4b<T extends core::Object* = core::Object*>() → void;
-  abstract method method4c<T extends core::Object* = core::Object*>() → void;
-  abstract method method5a<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5b<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5c<T extends self::Class1* = self::Class1*>() → void;
+  abstract method method2a<T extends core::Object*>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends core::Object*>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -144,20 +144,20 @@
     : super self::Class1::•()
     ;
   abstract method method1a<T extends core::Object* = dynamic>() → void;
-  abstract method method1b<T extends core::Object* = core::Object*>() → void;
-  abstract method method1c<T extends dynamic = dynamic>() → void;
+  abstract method method1b<T extends core::Object*>() → void;
+  abstract method method1c<T extends dynamic>() → void;
   abstract method method2a<T extends core::Object* = dynamic>() → void;
-  abstract method method2b<T extends core::Object* = core::Object*>() → void;
-  abstract method method2c<T extends dynamic = dynamic>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends dynamic>() → void;
   abstract method method3a<T extends core::Object* = dynamic>() → void;
-  abstract method method3b<T extends core::Object* = core::Object*>() → void;
-  abstract method method3c<T extends dynamic = dynamic>() → void;
-  abstract method method4a<T extends core::Object* = core::Object*>() → void;
-  abstract method method4b<T extends core::Object* = core::Object*>() → void;
-  abstract method method4c<T extends core::Object* = core::Object*>() → void;
-  abstract method method5a<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5b<T extends self::Class1* = self::Class1*>() → void;
-  abstract method method5c<T extends self::Class1* = self::Class1*>() → void;
+  abstract method method3b<T extends core::Object*>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -186,14 +186,14 @@
   abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
   abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
   abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
-  abstract member-signature method method2a<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2a
-  abstract member-signature method method2b<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2b
-  abstract member-signature method method2c<T extends core::Object* = core::Object*>() → void; -> self::Class1::method2c
-  abstract member-signature method method4a<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4a
-  abstract member-signature method method4b<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4b
-  abstract member-signature method method4c<T extends core::Object* = core::Object*>() → void; -> self::Class1::method4c
-  abstract member-signature method method5a<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5a
-  abstract member-signature method method5b<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5b
-  abstract member-signature method method5c<T extends self::Class1* = self::Class1*>() → void; -> self::Class1::method5c
+  abstract member-signature method method2a<T extends core::Object*>() → void; -> self::Class1::method2a
+  abstract member-signature method method2b<T extends core::Object*>() → void; -> self::Class1::method2b
+  abstract member-signature method method2c<T extends core::Object*>() → void; -> self::Class1::method2c
+  abstract member-signature method method4a<T extends core::Object*>() → void; -> self::Class1::method4a
+  abstract member-signature method method4b<T extends core::Object*>() → void; -> self::Class1::method4b
+  abstract member-signature method method4c<T extends core::Object*>() → void; -> self::Class1::method4c
+  abstract member-signature method method5a<T extends self::Class1*>() → void; -> self::Class1::method5a
+  abstract member-signature method method5b<T extends self::Class1*>() → void; -> self::Class1::method5b
+  abstract member-signature method method5c<T extends self::Class1*>() → void; -> self::Class1::method5c
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
index e4cfa36..c66b3a9 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
@@ -143,7 +143,7 @@
   synthetic constructor •() → inf::B
     : super core::Object::•()
     ;
-  abstract method bar<X extends core::List<core::int?>? = core::List<core::int?>?>() → inf::B::bar::X%;
+  abstract method bar<X extends core::List<core::int?>?>() → inf::B::bar::X%;
   abstract method foo(core::List<core::int> list) → dynamic;
 }
 static field inf::C<dynamic> field1 = new inf::C::•<dynamic>();
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.outline.expect
index b6062b8..363fbfb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.outline.expect
@@ -47,7 +47,7 @@
 abstract class B extends core::Object {
   synthetic constructor •() → inf::B
     ;
-  abstract method bar<X extends core::List<core::int?>? = core::List<core::int?>?>() → inf::B::bar::X%;
+  abstract method bar<X extends core::List<core::int?>?>() → inf::B::bar::X%;
   abstract method foo(core::List<core::int> list) → dynamic;
 }
 static field inf::C<dynamic> field1;
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
index d9beb51..97b6ea6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -143,7 +143,7 @@
   synthetic constructor •() → inf::B
     : super core::Object::•()
     ;
-  abstract method bar<X extends core::List<core::int?>? = core::List<core::int?>?>() → inf::B::bar::X%;
+  abstract method bar<X extends core::List<core::int?>?>() → inf::B::bar::X%;
   abstract method foo(core::List<core::int> list) → dynamic;
 }
 static field inf::C<dynamic> field1 = new inf::C::•<dynamic>();
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.expect
index 52dc9a8..2ae2d77 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.expect
@@ -15,6 +15,6 @@
 import "dart:core" as core;
 
 static field core::int y = 42;
-static method foo<T extends core::num = core::num>(inf::foo::T t1, inf::foo::T t2) → inf::foo::T
+static method foo<T extends core::num>(inf::foo::T t1, inf::foo::T t2) → inf::foo::T
   return t1;
 static method baz(core::int? v) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.outline.expect
index f226132..d760b98 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.outline.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static field core::int y;
-static method foo<T extends core::num = core::num>(self2::foo::T t1, self2::foo::T t2) → self2::foo::T
+static method foo<T extends core::num>(self2::foo::T t1, self2::foo::T t2) → self2::foo::T
   ;
 static method baz(core::int? v) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.transformed.expect
index 52dc9a8..2ae2d77 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.transformed.expect
@@ -15,6 +15,6 @@
 import "dart:core" as core;
 
 static field core::int y = 42;
-static method foo<T extends core::num = core::num>(inf::foo::T t1, inf::foo::T t2) → inf::foo::T
+static method foo<T extends core::num>(inf::foo::T t1, inf::foo::T t2) → inf::foo::T
   return t1;
 static method baz(core::int? v) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.expect
index 42dde26..779a4e3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 import "org-dartlang-testcase:///issue39666_lib.dart";
 
-class A<X extends FutureOr<core::List<dynamic>> = FutureOr<core::List<dynamic>>> extends core::Object {
+class A<X extends FutureOr<core::List<dynamic>>> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -18,7 +18,7 @@
 
 import "dart:async";
 
-class A<X extends FutureOr<core::List<dynamic>*>* = FutureOr<core::List<dynamic>*>*> extends core::Object {
+class A<X extends FutureOr<core::List<dynamic>*>*> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::X*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.outline.expect
index e703226..262d2a5 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 import "org-dartlang-testcase:///issue39666_lib.dart";
 
-class A<X extends FutureOr<core::List<dynamic>> = FutureOr<core::List<dynamic>>> extends core::Object {
+class A<X extends FutureOr<core::List<dynamic>>> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     ;
 }
@@ -18,7 +18,7 @@
 
 import "dart:async";
 
-class A<X extends FutureOr<core::List<dynamic>*>* = FutureOr<core::List<dynamic>*>*> extends core::Object {
+class A<X extends FutureOr<core::List<dynamic>*>*> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.transformed.expect
index 42dde26..779a4e3 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 import "org-dartlang-testcase:///issue39666_lib.dart";
 
-class A<X extends FutureOr<core::List<dynamic>> = FutureOr<core::List<dynamic>>> extends core::Object {
+class A<X extends FutureOr<core::List<dynamic>>> extends core::Object {
   synthetic constructor •() → self::A<self::A::X>
     : super core::Object::•()
     ;
@@ -18,7 +18,7 @@
 
 import "dart:async";
 
-class A<X extends FutureOr<core::List<dynamic>*>* = FutureOr<core::List<dynamic>*>*> extends core::Object {
+class A<X extends FutureOr<core::List<dynamic>*>*> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::X*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.expect
index 8bc2add..39658bf 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.expect
@@ -5,7 +5,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject = mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
+abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
 }
 abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin = mai::RenderProxyBox with mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin
@@ -78,17 +78,17 @@
   method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
     return false;
 }
-abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject = mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
   generic-covariant-impl field mai::RenderObjectWithChildMixin::ChildType? _child = null;
   get child() → mai::RenderObjectWithChildMixin::ChildType?
     return this.{mai::RenderObjectWithChildMixin::_child};
 }
-abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox = mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
+abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
   synthetic constructor •() → mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T>
     : super core::Object::•()
     ;
 }
-abstract class RenderProxyBoxMixin<T extends mai::RenderBox = mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
+abstract class RenderProxyBoxMixin<T extends mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
   @#C2
   method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool {
     return let final core::bool? #t1 = let final mai::RenderProxyBoxMixin::T? #t2 = this.{mai::RenderObjectWithChildMixin::child} in #t2.{core::Object::==}(null) ?{core::bool?} null : #t2{mai::RenderProxyBoxMixin::T}.{mai::RenderBox::hitTest}(result, position: position) in #t1.{core::Object::==}(null) ?{core::bool} false : #t1{core::bool};
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.outline.expect
index a221d7d..9cec757 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject = mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
+abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
 }
 abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin = mai::RenderProxyBox with mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin*/  {
   synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin
@@ -69,16 +69,16 @@
   method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position}) → core::bool
     ;
 }
-abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject = mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
   generic-covariant-impl field mai::RenderObjectWithChildMixin::ChildType? _child;
   get child() → mai::RenderObjectWithChildMixin::ChildType?
     ;
 }
-abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox = mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
+abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
   synthetic constructor •() → mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T>
     ;
 }
-abstract class RenderProxyBoxMixin<T extends mai::RenderBox = mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
+abstract class RenderProxyBoxMixin<T extends mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
   @#C1
   method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position}) → core::bool
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.transformed.expect
index 979cddb..d142fe2 100644
--- a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 
 import "org-dartlang-testcase:///main_lib.dart";
 
-abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject = mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
+abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
 }
 abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin extends mai::RenderProxyBox implements mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin,isEliminatedMixin*/  {
   synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin
@@ -80,17 +80,17 @@
   method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C2}) → core::bool
     return false;
 }
-abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject = mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
   generic-covariant-impl field mai::RenderObjectWithChildMixin::ChildType? _child = null;
   get child() → mai::RenderObjectWithChildMixin::ChildType?
     return this.{mai::RenderObjectWithChildMixin::_child};
 }
-abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox = mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
+abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
   synthetic constructor •() → mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T>
     : super core::Object::•()
     ;
 }
-abstract class RenderProxyBoxMixin<T extends mai::RenderBox = mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
+abstract class RenderProxyBoxMixin<T extends mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
   @#C1
   method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C2}) → core::bool {
     return let final core::bool? #t3 = let final mai::RenderProxyBoxMixin::T? #t4 = this.{mai::RenderObjectWithChildMixin::child} in #t4.{core::Object::==}(null) ?{core::bool?} null : #t4{mai::RenderProxyBoxMixin::T}.{mai::RenderBox::hitTest}(result, position: position) in #t3.{core::Object::==}(null) ?{core::bool} false : #t3{core::bool};
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
index 2572b51..2617678 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
@@ -169,7 +169,7 @@
     return null;
   set nullProperty(Null value) → void {}
 }
-class BoundedGenericClass<T extends Never = Never> extends core::Object {
+class BoundedGenericClass<T extends Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
     : super core::Object::•()
     ;
@@ -177,9 +177,9 @@
 late static field Never optInNever;
 static method throwing() → Never
   return throw "Never!";
-static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+static method boundedGenericMethod1<T extends Never>() → nev::boundedGenericMethod1::T
   return throw "Should never return";
-static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+static method boundedGenericMethod2<T extends Never>() → core::List<nev::boundedGenericMethod2::T>
   return <nev::boundedGenericMethod2::T>[];
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.outline.expect
index 32b770e..689fd991 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.outline.expect
@@ -108,14 +108,14 @@
   set nullProperty(Null value) → void
     ;
 }
-class BoundedGenericClass<T extends Never = Never> extends core::Object {
+class BoundedGenericClass<T extends Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
     ;
 }
 late static field Never optInNever;
 static method throwing() → Never
   ;
-static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+static method boundedGenericMethod1<T extends Never>() → nev::boundedGenericMethod1::T
   ;
-static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+static method boundedGenericMethod2<T extends Never>() → core::List<nev::boundedGenericMethod2::T>
   ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
index ce6f78a..fbb85cb 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
@@ -169,7 +169,7 @@
     return null;
   set nullProperty(Null value) → void {}
 }
-class BoundedGenericClass<T extends Never = Never> extends core::Object {
+class BoundedGenericClass<T extends Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
     : super core::Object::•()
     ;
@@ -177,9 +177,9 @@
 late static field Never optInNever;
 static method throwing() → Never
   return throw "Never!";
-static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+static method boundedGenericMethod1<T extends Never>() → nev::boundedGenericMethod1::T
   return throw "Should never return";
-static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+static method boundedGenericMethod2<T extends Never>() → core::List<nev::boundedGenericMethod2::T>
   return core::_GrowableList::•<nev::boundedGenericMethod2::T>(0);
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
index 561c9cb..16c5070 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.expect
@@ -24,8 +24,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract member-signature method method(core::int* i) → core::int*; -> nsm::A::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::A2::genericMethod1::T* t) → self::A2::genericMethod1::T*; -> nsm::A::genericMethod1
-  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
-  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
 }
 abstract class B2 extends nsm::A implements self::C2 {
   synthetic constructor •() → self::B2*
@@ -37,8 +37,8 @@
   }
   abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
-  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
-  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -55,8 +55,8 @@
     ;
   abstract method method(core::int* i, {dynamic optional = #C2}) → core::int*;
   abstract method genericMethod1<T extends core::Object* = dynamic>(self::C2::genericMethod1::T* t) → self::C2::genericMethod1::T*;
-  abstract method genericMethod2<T extends core::Object* = core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
-  abstract method genericMethod3<T extends core::Object* = core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
+  abstract method genericMethod2<T extends core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
+  abstract method genericMethod3<T extends core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -82,9 +82,9 @@
     return let final core::int? #t1 = i in #t1.{core::num::==}(null) ?{core::int} 0 : #t1{core::int};
   method genericMethod1<T extends core::Object? = dynamic>(nsm::A::genericMethod1::T% t) → nsm::A::genericMethod1::T%
     return t;
-  method genericMethod2<T extends core::Object? = core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
+  method genericMethod2<T extends core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
     return t;
-  method genericMethod3<T extends core::Object = core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
+  method genericMethod3<T extends core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
     return t;
 }
 abstract class B1 extends nsm::A implements nsm::C1 {
@@ -103,8 +103,8 @@
     ;
   abstract method method(core::int? i, {dynamic optional = #C2}) → core::int;
   abstract method genericMethod1<T extends core::Object? = dynamic>(nsm::C1::genericMethod1::T% t) → nsm::C1::genericMethod1::T%;
-  abstract method genericMethod2<T extends core::Object? = core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
-  abstract method genericMethod3<T extends core::Object = core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
+  abstract method genericMethod2<T extends core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
+  abstract method genericMethod3<T extends core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.outline.expect
index b110150..d463ddf 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.outline.expect
@@ -22,8 +22,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract member-signature method method(core::int* i) → core::int*; -> nsm::A::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::A2::genericMethod1::T* t) → self::A2::genericMethod1::T*; -> nsm::A::genericMethod1
-  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
-  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
 }
 abstract class B2 extends nsm::A implements self::C2 {
   synthetic constructor •() → self::B2*
@@ -33,8 +33,8 @@
     ;
   abstract member-signature method method(core::int* i, {dynamic optional}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
-  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
-  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -50,8 +50,8 @@
     ;
   abstract method method(core::int* i, {dynamic optional}) → core::int*;
   abstract method genericMethod1<T extends core::Object* = dynamic>(self::C2::genericMethod1::T* t) → self::C2::genericMethod1::T*;
-  abstract method genericMethod2<T extends core::Object* = core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
-  abstract method genericMethod3<T extends core::Object* = core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
+  abstract method genericMethod2<T extends core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
+  abstract method genericMethod3<T extends core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -77,9 +77,9 @@
     ;
   method genericMethod1<T extends core::Object? = dynamic>(nsm::A::genericMethod1::T% t) → nsm::A::genericMethod1::T%
     ;
-  method genericMethod2<T extends core::Object? = core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
+  method genericMethod2<T extends core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
     ;
-  method genericMethod3<T extends core::Object = core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
+  method genericMethod3<T extends core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
     ;
 }
 abstract class B1 extends nsm::A implements nsm::C1 {
@@ -95,8 +95,8 @@
     ;
   abstract method method(core::int? i, {dynamic optional}) → core::int;
   abstract method genericMethod1<T extends core::Object? = dynamic>(nsm::C1::genericMethod1::T% t) → nsm::C1::genericMethod1::T%;
-  abstract method genericMethod2<T extends core::Object? = core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
-  abstract method genericMethod3<T extends core::Object = core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
+  abstract method genericMethod2<T extends core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
+  abstract method genericMethod3<T extends core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
index 561c9cb..16c5070 100644
--- a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.transformed.expect
@@ -24,8 +24,8 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   abstract member-signature method method(core::int* i) → core::int*; -> nsm::A::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::A2::genericMethod1::T* t) → self::A2::genericMethod1::T*; -> nsm::A::genericMethod1
-  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
-  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
 }
 abstract class B2 extends nsm::A implements self::C2 {
   synthetic constructor •() → self::B2*
@@ -37,8 +37,8 @@
   }
   abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
   abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
-  abstract member-signature method genericMethod2<T extends core::Object* = core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
-  abstract member-signature method genericMethod3<T extends core::Object* = core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -55,8 +55,8 @@
     ;
   abstract method method(core::int* i, {dynamic optional = #C2}) → core::int*;
   abstract method genericMethod1<T extends core::Object* = dynamic>(self::C2::genericMethod1::T* t) → self::C2::genericMethod1::T*;
-  abstract method genericMethod2<T extends core::Object* = core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
-  abstract method genericMethod3<T extends core::Object* = core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
+  abstract method genericMethod2<T extends core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
+  abstract method genericMethod3<T extends core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -82,9 +82,9 @@
     return let final core::int? #t1 = i in #t1.{core::num::==}(null) ?{core::int} 0 : #t1{core::int};
   method genericMethod1<T extends core::Object? = dynamic>(nsm::A::genericMethod1::T% t) → nsm::A::genericMethod1::T%
     return t;
-  method genericMethod2<T extends core::Object? = core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
+  method genericMethod2<T extends core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
     return t;
-  method genericMethod3<T extends core::Object = core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
+  method genericMethod3<T extends core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
     return t;
 }
 abstract class B1 extends nsm::A implements nsm::C1 {
@@ -103,8 +103,8 @@
     ;
   abstract method method(core::int? i, {dynamic optional = #C2}) → core::int;
   abstract method genericMethod1<T extends core::Object? = dynamic>(nsm::C1::genericMethod1::T% t) → nsm::C1::genericMethod1::T%;
-  abstract method genericMethod2<T extends core::Object? = core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
-  abstract method genericMethod3<T extends core::Object = core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
+  abstract method genericMethod2<T extends core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
+  abstract method genericMethod3<T extends core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
index 964ecb3..c8d8780 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.expect
@@ -33,40 +33,40 @@
 import self as opt;
 import "dart:core" as core;
 
-class Class1<T extends core::Object? = core::Object?> extends core::Object /*hasConstConstructor*/  {
+class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class1::redirect, opt::Class1::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class1<opt::Class1::T%>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
+  static factory redirect<T extends core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
     let dynamic #redirecting_factory = opt::Class1::_ in let opt::Class1::redirect::T% #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
+  static factory constRedirect<T extends core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
     let dynamic #redirecting_factory = opt::Class1::_ in let opt::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::fact::T%>
+  static factory fact<T extends core::Object?>() → opt::Class1<opt::Class1::fact::T%>
     return new opt::Class1::_<opt::Class1::fact::T%>();
 }
-class Class2<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class2::redirect, opt::Class2::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class2<opt::Class2::T>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::redirect::T>
+  static factory redirect<T extends core::Object>() → opt::Class2<opt::Class2::redirect::T>
     let dynamic #redirecting_factory = opt::Class2::_ in let opt::Class2::redirect::T #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
+  static factory constRedirect<T extends core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
     let dynamic #redirecting_factory = opt::Class2::_ in let opt::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::fact::T>
+  static factory fact<T extends core::Object>() → opt::Class2<opt::Class2::fact::T>
     return new opt::Class2::_<opt::Class2::fact::T>();
 }
-class Class3<T extends core::String = core::String> extends core::Object /*hasConstConstructor*/  {
+class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class3::redirect, opt::Class3::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class3<opt::Class3::T>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::String = core::String>() → opt::Class3<opt::Class3::redirect::T>
+  static factory redirect<T extends core::String>() → opt::Class3<opt::Class3::redirect::T>
     let dynamic #redirecting_factory = opt::Class3::_ in let opt::Class3::redirect::T #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::String = core::String>() → opt::Class3<opt::Class3::constRedirect::T>
+  static factory constRedirect<T extends core::String>() → opt::Class3<opt::Class3::constRedirect::T>
     let dynamic #redirecting_factory = opt::Class3::_ in let opt::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::String = core::String>() → opt::Class3<opt::Class3::fact::T>
+  static factory fact<T extends core::String>() → opt::Class3<opt::Class3::fact::T>
     return new opt::Class3::_<opt::Class3::fact::T>();
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
@@ -81,16 +81,16 @@
   static factory fact<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::fact::T%>
     return new opt::Class4::_<opt::Class4::fact::T%>();
 }
-class Class5<T extends dynamic = dynamic> extends core::Object /*hasConstConstructor*/  {
+class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class5::redirect, opt::Class5::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class5<opt::Class5::T%>
     : super core::Object::•()
     ;
-  static factory redirect<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::redirect::T%>
+  static factory redirect<T extends dynamic>() → opt::Class5<opt::Class5::redirect::T%>
     let dynamic #redirecting_factory = opt::Class5::_ in let opt::Class5::redirect::T% #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
+  static factory constRedirect<T extends dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
     let dynamic #redirecting_factory = opt::Class5::_ in let opt::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
-  static factory fact<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::fact::T%>
+  static factory fact<T extends dynamic>() → opt::Class5<opt::Class5::fact::T%>
     return new opt::Class5::_<opt::Class5::fact::T%>();
 }
 static method testOptIn() → dynamic {
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
index 64dc146..f70672f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.outline.expect
@@ -10,40 +10,40 @@
 import self as self2;
 import "dart:core" as core;
 
-class Class1<T extends core::Object? = core::Object?> extends core::Object /*hasConstConstructor*/  {
+class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[self2::Class1::redirect, self2::Class1::constRedirect]/*isLegacy*/;
   const constructor _() → self2::Class1<self2::Class1::T%>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::Object? = core::Object?>() → self2::Class1<self2::Class1::redirect::T%>
+  static factory redirect<T extends core::Object?>() → self2::Class1<self2::Class1::redirect::T%>
     let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::redirect::T% #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::Object? = core::Object?>() → self2::Class1<self2::Class1::constRedirect::T%>
+  static factory constRedirect<T extends core::Object?>() → self2::Class1<self2::Class1::constRedirect::T%>
     let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::Object? = core::Object?>() → self2::Class1<self2::Class1::fact::T%>
+  static factory fact<T extends core::Object?>() → self2::Class1<self2::Class1::fact::T%>
     ;
 }
-class Class2<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[self2::Class2::redirect, self2::Class2::constRedirect]/*isLegacy*/;
   const constructor _() → self2::Class2<self2::Class2::T>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::Object = core::Object>() → self2::Class2<self2::Class2::redirect::T>
+  static factory redirect<T extends core::Object>() → self2::Class2<self2::Class2::redirect::T>
     let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::redirect::T #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::Object = core::Object>() → self2::Class2<self2::Class2::constRedirect::T>
+  static factory constRedirect<T extends core::Object>() → self2::Class2<self2::Class2::constRedirect::T>
     let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::Object = core::Object>() → self2::Class2<self2::Class2::fact::T>
+  static factory fact<T extends core::Object>() → self2::Class2<self2::Class2::fact::T>
     ;
 }
-class Class3<T extends core::String = core::String> extends core::Object /*hasConstConstructor*/  {
+class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[self2::Class3::redirect, self2::Class3::constRedirect]/*isLegacy*/;
   const constructor _() → self2::Class3<self2::Class3::T>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::String = core::String>() → self2::Class3<self2::Class3::redirect::T>
+  static factory redirect<T extends core::String>() → self2::Class3<self2::Class3::redirect::T>
     let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::redirect::T #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::String = core::String>() → self2::Class3<self2::Class3::constRedirect::T>
+  static factory constRedirect<T extends core::String>() → self2::Class3<self2::Class3::constRedirect::T>
     let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::String = core::String>() → self2::Class3<self2::Class3::fact::T>
+  static factory fact<T extends core::String>() → self2::Class3<self2::Class3::fact::T>
     ;
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
@@ -58,16 +58,16 @@
   static factory fact<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::fact::T%>
     ;
 }
-class Class5<T extends dynamic = dynamic> extends core::Object /*hasConstConstructor*/  {
+class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[self2::Class5::redirect, self2::Class5::constRedirect]/*isLegacy*/;
   const constructor _() → self2::Class5<self2::Class5::T%>
     : super core::Object::•()
     ;
-  static factory redirect<T extends dynamic = dynamic>() → self2::Class5<self2::Class5::redirect::T%>
+  static factory redirect<T extends dynamic>() → self2::Class5<self2::Class5::redirect::T%>
     let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::redirect::T% #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends dynamic = dynamic>() → self2::Class5<self2::Class5::constRedirect::T%>
+  static factory constRedirect<T extends dynamic>() → self2::Class5<self2::Class5::constRedirect::T%>
     let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
-  static factory fact<T extends dynamic = dynamic>() → self2::Class5<self2::Class5::fact::T%>
+  static factory fact<T extends dynamic>() → self2::Class5<self2::Class5::fact::T%>
     ;
 }
 static method testOptIn() → dynamic
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
index 460ddca..93eb282 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.transformed.expect
@@ -33,40 +33,40 @@
 import self as opt;
 import "dart:core" as core;
 
-class Class1<T extends core::Object? = core::Object?> extends core::Object /*hasConstConstructor*/  {
+class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class1::redirect, opt::Class1::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class1<opt::Class1::T%>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
+  static factory redirect<T extends core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
     let Never #redirecting_factory = opt::Class1::_ in let opt::Class1::redirect::T% #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
+  static factory constRedirect<T extends core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
     let Never #redirecting_factory = opt::Class1::_ in let opt::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::Object? = core::Object?>() → opt::Class1<opt::Class1::fact::T%>
+  static factory fact<T extends core::Object?>() → opt::Class1<opt::Class1::fact::T%>
     return new opt::Class1::_<opt::Class1::fact::T%>();
 }
-class Class2<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class2::redirect, opt::Class2::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class2<opt::Class2::T>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::redirect::T>
+  static factory redirect<T extends core::Object>() → opt::Class2<opt::Class2::redirect::T>
     let Never #redirecting_factory = opt::Class2::_ in let opt::Class2::redirect::T #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
+  static factory constRedirect<T extends core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
     let Never #redirecting_factory = opt::Class2::_ in let opt::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::Object = core::Object>() → opt::Class2<opt::Class2::fact::T>
+  static factory fact<T extends core::Object>() → opt::Class2<opt::Class2::fact::T>
     return new opt::Class2::_<opt::Class2::fact::T>();
 }
-class Class3<T extends core::String = core::String> extends core::Object /*hasConstConstructor*/  {
+class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class3::redirect, opt::Class3::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class3<opt::Class3::T>
     : super core::Object::•()
     ;
-  static factory redirect<T extends core::String = core::String>() → opt::Class3<opt::Class3::redirect::T>
+  static factory redirect<T extends core::String>() → opt::Class3<opt::Class3::redirect::T>
     let Never #redirecting_factory = opt::Class3::_ in let opt::Class3::redirect::T #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends core::String = core::String>() → opt::Class3<opt::Class3::constRedirect::T>
+  static factory constRedirect<T extends core::String>() → opt::Class3<opt::Class3::constRedirect::T>
     let Never #redirecting_factory = opt::Class3::_ in let opt::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
-  static factory fact<T extends core::String = core::String>() → opt::Class3<opt::Class3::fact::T>
+  static factory fact<T extends core::String>() → opt::Class3<opt::Class3::fact::T>
     return new opt::Class3::_<opt::Class3::fact::T>();
 }
 class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
@@ -81,16 +81,16 @@
   static factory fact<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::fact::T%>
     return new opt::Class4::_<opt::Class4::fact::T%>();
 }
-class Class5<T extends dynamic = dynamic> extends core::Object /*hasConstConstructor*/  {
+class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::Class5::redirect, opt::Class5::constRedirect]/*isLegacy*/;
   const constructor _() → opt::Class5<opt::Class5::T%>
     : super core::Object::•()
     ;
-  static factory redirect<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::redirect::T%>
+  static factory redirect<T extends dynamic>() → opt::Class5<opt::Class5::redirect::T%>
     let Never #redirecting_factory = opt::Class5::_ in let opt::Class5::redirect::T% #typeArg0 = null in invalid-expression;
-  static factory constRedirect<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
+  static factory constRedirect<T extends dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
     let Never #redirecting_factory = opt::Class5::_ in let opt::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
-  static factory fact<T extends dynamic = dynamic>() → opt::Class5<opt::Class5::fact::T%>
+  static factory fact<T extends dynamic>() → opt::Class5<opt::Class5::fact::T%>
     return new opt::Class5::_<opt::Class5::fact::T%>();
 }
 static method testOptIn() → dynamic {
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
index f9e81d9..7ffad38 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.expect
@@ -43,31 +43,31 @@
 import self as opt;
 import "dart:core" as core;
 
-class P<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class P<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   final field core::Object token;
   const constructor _(core::Object token) → opt::P<opt::P::T>
     : opt::P::token = token, super core::Object::•()
     ;
 }
-class CP<T extends core::Object = core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
+class CP<T extends core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::CP::•]/*isLegacy*/;
   const constructor _(core::Object token) → opt::CP<opt::CP::T>
     : super opt::P::_(token)
     ;
-  static factory •<T extends core::Object = core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
+  static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
     let dynamic #redirecting_factory = opt::CP::_ in let opt::CP::•::T #typeArg0 = null in invalid-expression;
 }
-class Token<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → opt::Token<opt::Token::T>
     : super core::Object::•()
     ;
 }
-class VP<T extends core::Object = core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
+class VP<T extends core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::VP::forToken]/*isLegacy*/;
   const constructor _(core::Object token, opt::VP::T useValue) → opt::VP<opt::VP::T>
     : super opt::P::_(token)
     ;
-  static factory forToken<T extends core::Object = core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
+  static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
     let dynamic #redirecting_factory = opt::VP::_ in let opt::VP::forToken::T #typeArg0 = null in invalid-expression;
 }
 class M extends core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
index 95b24a3..06c295f 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.outline.expect
@@ -43,31 +43,31 @@
 import self as opt;
 import "dart:core" as core;
 
-class P<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class P<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   final field core::Object token;
   const constructor _(core::Object token) → opt::P<opt::P::T>
     : opt::P::token = token, super core::Object::•()
     ;
 }
-class CP<T extends core::Object = core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
+class CP<T extends core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::CP::•]/*isLegacy*/;
   const constructor _(core::Object token) → opt::CP<opt::CP::T>
     : super opt::P::_(token)
     ;
-  static factory •<T extends core::Object = core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
+  static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
     let dynamic #redirecting_factory = opt::CP::_ in let opt::CP::•::T #typeArg0 = null in invalid-expression;
 }
-class Token<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → opt::Token<opt::Token::T>
     : super core::Object::•()
     ;
 }
-class VP<T extends core::Object = core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
+class VP<T extends core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::VP::forToken]/*isLegacy*/;
   const constructor _(core::Object token, opt::VP::T useValue) → opt::VP<opt::VP::T>
     : super opt::P::_(token)
     ;
-  static factory forToken<T extends core::Object = core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
+  static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
     let dynamic #redirecting_factory = opt::VP::_ in let opt::VP::forToken::T #typeArg0 = null in invalid-expression;
 }
 class M extends core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
index e074504..f4c2c29 100644
--- a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.transformed.expect
@@ -43,31 +43,31 @@
 import self as opt;
 import "dart:core" as core;
 
-class P<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class P<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   final field core::Object token;
   const constructor _(core::Object token) → opt::P<opt::P::T>
     : opt::P::token = token, super core::Object::•()
     ;
 }
-class CP<T extends core::Object = core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
+class CP<T extends core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::CP::•]/*isLegacy*/;
   const constructor _(core::Object token) → opt::CP<opt::CP::T>
     : super opt::P::_(token)
     ;
-  static factory •<T extends core::Object = core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
+  static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
     let Never #redirecting_factory = opt::CP::_ in let opt::CP::•::T #typeArg0 = null in invalid-expression;
 }
-class Token<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
+class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → opt::Token<opt::Token::T>
     : super core::Object::•()
     ;
 }
-class VP<T extends core::Object = core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
+class VP<T extends core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
   static final field dynamic _redirecting# = <dynamic>[opt::VP::forToken]/*isLegacy*/;
   const constructor _(core::Object token, opt::VP::T useValue) → opt::VP<opt::VP::T>
     : super opt::P::_(token)
     ;
-  static factory forToken<T extends core::Object = core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
+  static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
     let Never #redirecting_factory = opt::VP::_ in let opt::VP::forToken::T #typeArg0 = null in invalid-expression;
 }
 class M extends core::Object /*hasConstConstructor*/  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
index ca14755..6bf247e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
@@ -98,13 +98,13 @@
 import self as mai2;
 import "dart:core" as core;
 
-typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
 abstract class Value<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → mai2::Value<mai2::Value::T%>
     : super core::Object::•()
     ;
 }
-class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
   field (mai2::Interface::I%) →? core::Type field = null;
   synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect
index ec066e1..7f83539 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect
@@ -93,12 +93,12 @@
 import self as mai2;
 import "dart:core" as core;
 
-typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
 abstract class Value<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → mai2::Value<mai2::Value::T%>
     ;
 }
-class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
   field (mai2::Interface::I%) →? core::Type field;
   synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
index 7f96d00..2a72e6a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
@@ -94,13 +94,13 @@
 import self as mai2;
 import "dart:core" as core;
 
-typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
 abstract class Value<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → mai2::Value<mai2::Value::T%>
     : super core::Object::•()
     ;
 }
-class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
   field (mai2::Interface::I%) →? core::Type field = null;
   synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
index ca14755..6bf247e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
@@ -98,13 +98,13 @@
 import self as mai2;
 import "dart:core" as core;
 
-typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
 abstract class Value<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → mai2::Value<mai2::Value::T%>
     : super core::Object::•()
     ;
 }
-class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
   field (mai2::Interface::I%) →? core::Type field = null;
   synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect
index ec066e1..7f83539 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect
@@ -93,12 +93,12 @@
 import self as mai2;
 import "dart:core" as core;
 
-typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
 abstract class Value<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → mai2::Value<mai2::Value::T%>
     ;
 }
-class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
   field (mai2::Interface::I%) →? core::Type field;
   synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
index 7f96d00..2a72e6a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
@@ -94,13 +94,13 @@
 import self as mai2;
 import "dart:core" as core;
 
-typedef Typedef<unrelated T extends mai2::Value<dynamic> = mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
 abstract class Value<T extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → mai2::Value<mai2::Value::T%>
     : super core::Object::•()
     ;
 }
-class Interface<T extends mai2::Value<dynamic> = mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
   field (mai2::Interface::I%) →? core::Type field = null;
   synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.expect
index 8bf95a6..cd3de48 100644
--- a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.expect
@@ -5,7 +5,7 @@
 
 import "org-dartlang-testcase:///type_parameter_nullability_lib.dart";
 
-class C<T extends core::num? = core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
+class C<T extends core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T%, self::C::S%, self::C::U%>
     : super core::Object::•()
     ;
@@ -36,7 +36,7 @@
 import self as typ;
 import "dart:core" as core;
 
-class D<T extends core::num* = core::num*> extends core::Object {
+class D<T extends core::num*> extends core::Object {
   synthetic constructor •() → typ::D<typ::D::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.outline.expect
index ffb28dc..ef4392a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.outline.expect
@@ -4,7 +4,7 @@
 
 import "org-dartlang-testcase:///type_parameter_nullability_lib.dart";
 
-class C<T extends core::num? = core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
+class C<T extends core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T%, self::C::S%, self::C::U%>
     ;
   method promoteNullable(generic-covariant-impl self::C::T? t) → void
@@ -19,7 +19,7 @@
 import self as self2;
 import "dart:core" as core;
 
-class D<T extends core::num* = core::num*> extends core::Object {
+class D<T extends core::num*> extends core::Object {
   synthetic constructor •() → self2::D<self2::D::T*>*
     ;
   method promoteLegacy(generic-covariant-impl self2::D::T* t) → void
diff --git a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.transformed.expect
index 8bf95a6..cd3de48 100644
--- a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 
 import "org-dartlang-testcase:///type_parameter_nullability_lib.dart";
 
-class C<T extends core::num? = core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
+class C<T extends core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T%, self::C::S%, self::C::U%>
     : super core::Object::•()
     ;
@@ -36,7 +36,7 @@
 import self as typ;
 import "dart:core" as core;
 
-class D<T extends core::num* = core::num*> extends core::Object {
+class D<T extends core::num*> extends core::Object {
   synthetic constructor •() → typ::D<typ::D::T*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/none/equals.dart.strong.expect b/pkg/front_end/testcases/none/equals.dart.strong.expect
index 3c8e61d..daaf5db 100644
--- a/pkg/front_end/testcases/none/equals.dart.strong.expect
+++ b/pkg/front_end/testcases/none/equals.dart.strong.expect
@@ -126,7 +126,7 @@
   method method(dynamic o) → dynamic {}
 }
 static const field core::Object? nullValue = #C1;
-static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
   core::print("EqualsNull (literal null)");
   null == null;
   !(null == null);
diff --git a/pkg/front_end/testcases/none/equals.dart.weak.expect b/pkg/front_end/testcases/none/equals.dart.weak.expect
index 622fa6c8..5b4129e 100644
--- a/pkg/front_end/testcases/none/equals.dart.weak.expect
+++ b/pkg/front_end/testcases/none/equals.dart.weak.expect
@@ -127,7 +127,7 @@
   method method(dynamic o) → dynamic {}
 }
 static const field core::Object? nullValue = #C1;
-static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
   core::print("EqualsNull (literal null)");
   null == null;
   !(null == null);
diff --git a/pkg/front_end/testcases/none/equals.dart.weak.outline.expect b/pkg/front_end/testcases/none/equals.dart.weak.outline.expect
index aae3b91..911e7cd 100644
--- a/pkg/front_end/testcases/none/equals.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/none/equals.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
 }
 static const field core::Object? nullValue = null;
-static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic
   ;
 static method nullEqualsIndexGet(core::Map<core::int, core::String> map) → dynamic
   ;
diff --git a/pkg/front_end/testcases/none/method_invocation.dart.strong.expect b/pkg/front_end/testcases/none/method_invocation.dart.strong.expect
index d1046ad..32d8252 100644
--- a/pkg/front_end/testcases/none/method_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/none/method_invocation.dart.strong.expect
@@ -135,7 +135,7 @@
 static const field core::int i = #C1;
 static const field core::int j = #C2;
 static const field core::int k = #C3;
-static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic {
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic {
   core::print("InstanceInvocation");
   nonNullableClass1.{self::Class1::method}(0){(core::int) → core::double};
   let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::double?} null : #t1{self::Class1}.{self::Class1::method}(0){(core::int) → core::double};
diff --git a/pkg/front_end/testcases/none/method_invocation.dart.weak.expect b/pkg/front_end/testcases/none/method_invocation.dart.weak.expect
index 436611c..0f57fe6 100644
--- a/pkg/front_end/testcases/none/method_invocation.dart.weak.expect
+++ b/pkg/front_end/testcases/none/method_invocation.dart.weak.expect
@@ -136,7 +136,7 @@
 static const field core::int i = #C1;
 static const field core::int j = #C2;
 static const field core::int k = #C3;
-static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic {
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic {
   core::print("InstanceInvocation");
   nonNullableClass1.{self::Class1::method}(0){(core::int) → core::double};
   let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::double?} null : #t1{self::Class1}.{self::Class1::method}(0){(core::int) → core::double};
diff --git a/pkg/front_end/testcases/none/method_invocation.dart.weak.outline.expect b/pkg/front_end/testcases/none/method_invocation.dart.weak.outline.expect
index 8a7fc69..7358160 100644
--- a/pkg/front_end/testcases/none/method_invocation.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/none/method_invocation.dart.weak.outline.expect
@@ -32,7 +32,7 @@
 static const field core::int i = 4;
 static const field core::int j = 24;
 static const field core::int k = self::i.{core::num::*}(self::j){(core::num) → core::int};
-static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/none/property_get.dart.strong.expect b/pkg/front_end/testcases/none/property_get.dart.strong.expect
index b753715..921ff16 100644
--- a/pkg/front_end/testcases/none/property_get.dart.strong.expect
+++ b/pkg/front_end/testcases/none/property_get.dart.strong.expect
@@ -61,7 +61,7 @@
 static const field core::int dynamicStringLength = #C2;
 static method topLevelMethod(core::double o) → core::int
   return 0;
-static method test<T1 extends core::Function = core::Function, T2 extends () → core::int = () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
+static method test<T1 extends core::Function, T2 extends () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
   core::print("InstanceGet");
   nonNullableClass1.{self::Class1::field}{core::int};
   let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::int?} null : #t1{self::Class1}.{self::Class1::field}{core::int};
diff --git a/pkg/front_end/testcases/none/property_get.dart.weak.expect b/pkg/front_end/testcases/none/property_get.dart.weak.expect
index db37697..67ded25 100644
--- a/pkg/front_end/testcases/none/property_get.dart.weak.expect
+++ b/pkg/front_end/testcases/none/property_get.dart.weak.expect
@@ -62,7 +62,7 @@
 static const field core::int dynamicStringLength = #C2;
 static method topLevelMethod(core::double o) → core::int
   return 0;
-static method test<T1 extends core::Function = core::Function, T2 extends () → core::int = () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
+static method test<T1 extends core::Function, T2 extends () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
   core::print("InstanceGet");
   nonNullableClass1.{self::Class1::field}{core::int};
   let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::int?} null : #t1{self::Class1}.{self::Class1::field}{core::int};
diff --git a/pkg/front_end/testcases/none/property_get.dart.weak.outline.expect b/pkg/front_end/testcases/none/property_get.dart.weak.outline.expect
index 06c8396..fcd26f0 100644
--- a/pkg/front_end/testcases/none/property_get.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/none/property_get.dart.weak.outline.expect
@@ -26,7 +26,7 @@
 static const field core::int dynamicStringLength = self::dynamicString{dynamic}.length as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
 static method topLevelMethod(core::double o) → core::int
   ;
-static method test<T1 extends core::Function = core::Function, T2 extends () → core::int = () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic
+static method test<T1 extends core::Function, T2 extends () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.expect
index 7506643..68d1353 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.expect
@@ -175,7 +175,7 @@
     : super core::Object::•()
     ;
 }
-class Bar1<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>> extends core::Object {
+class Bar1<X extends self::A<self::A<core::int>>> extends core::Object {
   synthetic constructor •() → self::Bar1<self::Bar1::X>
     : super core::Object::•()
     ;
@@ -183,10 +183,10 @@
     return throw 42;
   method barBar12(self::A<self::A<core::int>> x) → dynamic
     return throw 42;
-  method barBar13<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+  method barBar13<X extends self::A<self::A<core::int>>>() → dynamic
     return throw 42;
 }
-class Bar2<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>> extends core::Object {
+class Bar2<X extends self::A<self::A<self::A<core::int>>>> extends core::Object {
   synthetic constructor •() → self::Bar2<self::Bar2::X>
     : super core::Object::•()
     ;
@@ -194,7 +194,7 @@
     return throw 42;
   method barBar22(self::A<self::A<self::A<core::int>>> x) → dynamic
     return throw 42;
-  method barBar23<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+  method barBar23<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
     return throw 42;
 }
 static method foo() → dynamic {
@@ -209,8 +209,8 @@
   return throw 42;
 static method bar2b(self::A<self::A<self::A<core::int>>> x) → dynamic
   return throw 42;
-static method bar3a<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+static method bar3a<X extends self::A<self::A<core::int>>>() → dynamic
   return throw 42;
-static method bar3b<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+static method bar3b<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.transformed.expect
index 7506643..68d1353 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.strong.transformed.expect
@@ -175,7 +175,7 @@
     : super core::Object::•()
     ;
 }
-class Bar1<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>> extends core::Object {
+class Bar1<X extends self::A<self::A<core::int>>> extends core::Object {
   synthetic constructor •() → self::Bar1<self::Bar1::X>
     : super core::Object::•()
     ;
@@ -183,10 +183,10 @@
     return throw 42;
   method barBar12(self::A<self::A<core::int>> x) → dynamic
     return throw 42;
-  method barBar13<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+  method barBar13<X extends self::A<self::A<core::int>>>() → dynamic
     return throw 42;
 }
-class Bar2<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>> extends core::Object {
+class Bar2<X extends self::A<self::A<self::A<core::int>>>> extends core::Object {
   synthetic constructor •() → self::Bar2<self::Bar2::X>
     : super core::Object::•()
     ;
@@ -194,7 +194,7 @@
     return throw 42;
   method barBar22(self::A<self::A<self::A<core::int>>> x) → dynamic
     return throw 42;
-  method barBar23<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+  method barBar23<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
     return throw 42;
 }
 static method foo() → dynamic {
@@ -209,8 +209,8 @@
   return throw 42;
 static method bar2b(self::A<self::A<self::A<core::int>>> x) → dynamic
   return throw 42;
-static method bar3a<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+static method bar3a<X extends self::A<self::A<core::int>>>() → dynamic
   return throw 42;
-static method bar3b<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+static method bar3b<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.expect
index 7506643..68d1353 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.expect
@@ -175,7 +175,7 @@
     : super core::Object::•()
     ;
 }
-class Bar1<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>> extends core::Object {
+class Bar1<X extends self::A<self::A<core::int>>> extends core::Object {
   synthetic constructor •() → self::Bar1<self::Bar1::X>
     : super core::Object::•()
     ;
@@ -183,10 +183,10 @@
     return throw 42;
   method barBar12(self::A<self::A<core::int>> x) → dynamic
     return throw 42;
-  method barBar13<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+  method barBar13<X extends self::A<self::A<core::int>>>() → dynamic
     return throw 42;
 }
-class Bar2<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>> extends core::Object {
+class Bar2<X extends self::A<self::A<self::A<core::int>>>> extends core::Object {
   synthetic constructor •() → self::Bar2<self::Bar2::X>
     : super core::Object::•()
     ;
@@ -194,7 +194,7 @@
     return throw 42;
   method barBar22(self::A<self::A<self::A<core::int>>> x) → dynamic
     return throw 42;
-  method barBar23<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+  method barBar23<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
     return throw 42;
 }
 static method foo() → dynamic {
@@ -209,8 +209,8 @@
   return throw 42;
 static method bar2b(self::A<self::A<self::A<core::int>>> x) → dynamic
   return throw 42;
-static method bar3a<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+static method bar3a<X extends self::A<self::A<core::int>>>() → dynamic
   return throw 42;
-static method bar3b<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+static method bar3b<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.outline.expect
index e66dde1..224c9fc 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.outline.expect
@@ -156,24 +156,24 @@
   synthetic constructor •() → self::A<self::A::T%>
     ;
 }
-class Bar1<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>> extends core::Object {
+class Bar1<X extends self::A<self::A<core::int>>> extends core::Object {
   synthetic constructor •() → self::Bar1<self::Bar1::X>
     ;
   method barBar11() → self::A<self::A<core::int>>
     ;
   method barBar12(self::A<self::A<core::int>> x) → dynamic
     ;
-  method barBar13<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+  method barBar13<X extends self::A<self::A<core::int>>>() → dynamic
     ;
 }
-class Bar2<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>> extends core::Object {
+class Bar2<X extends self::A<self::A<self::A<core::int>>>> extends core::Object {
   synthetic constructor •() → self::Bar2<self::Bar2::X>
     ;
   method barBar21() → self::A<self::A<self::A<core::int>>>
     ;
   method barBar22(self::A<self::A<self::A<core::int>>> x) → dynamic
     ;
-  method barBar23<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+  method barBar23<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
     ;
 }
 static method foo() → dynamic
@@ -186,9 +186,9 @@
   ;
 static method bar2b(self::A<self::A<self::A<core::int>>> x) → dynamic
   ;
-static method bar3a<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+static method bar3a<X extends self::A<self::A<core::int>>>() → dynamic
   ;
-static method bar3b<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+static method bar3b<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.transformed.expect
index 7506643..68d1353 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.transformed.expect
@@ -175,7 +175,7 @@
     : super core::Object::•()
     ;
 }
-class Bar1<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>> extends core::Object {
+class Bar1<X extends self::A<self::A<core::int>>> extends core::Object {
   synthetic constructor •() → self::Bar1<self::Bar1::X>
     : super core::Object::•()
     ;
@@ -183,10 +183,10 @@
     return throw 42;
   method barBar12(self::A<self::A<core::int>> x) → dynamic
     return throw 42;
-  method barBar13<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+  method barBar13<X extends self::A<self::A<core::int>>>() → dynamic
     return throw 42;
 }
-class Bar2<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>> extends core::Object {
+class Bar2<X extends self::A<self::A<self::A<core::int>>>> extends core::Object {
   synthetic constructor •() → self::Bar2<self::Bar2::X>
     : super core::Object::•()
     ;
@@ -194,7 +194,7 @@
     return throw 42;
   method barBar22(self::A<self::A<self::A<core::int>>> x) → dynamic
     return throw 42;
-  method barBar23<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+  method barBar23<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
     return throw 42;
 }
 static method foo() → dynamic {
@@ -209,8 +209,8 @@
   return throw 42;
 static method bar2b(self::A<self::A<self::A<core::int>>> x) → dynamic
   return throw 42;
-static method bar3a<X extends self::A<self::A<core::int>> = self::A<self::A<core::int>>>() → dynamic
+static method bar3a<X extends self::A<self::A<core::int>>>() → dynamic
   return throw 42;
-static method bar3b<X extends self::A<self::A<self::A<core::int>>> = self::A<self::A<self::A<core::int>>>>() → dynamic
+static method bar3b<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
   return throw 42;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect
index 2b7816b..221969e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.expect
@@ -29,9 +29,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<unrelated X extends core::int = core::int> = core::String;
-typedef B<unrelated X extends core::int = core::int> = core::String;
-typedef C<X extends core::int = core::int> = X;
+typedef A<unrelated X extends core::int> = core::String;
+typedef B<unrelated X extends core::int> = core::String;
+typedef C<X extends core::int> = X;
 static method foo() → dynamic {
   core::String a;
 }
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect
index 2b7816b..221969e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.strong.transformed.expect
@@ -29,9 +29,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<unrelated X extends core::int = core::int> = core::String;
-typedef B<unrelated X extends core::int = core::int> = core::String;
-typedef C<X extends core::int = core::int> = X;
+typedef A<unrelated X extends core::int> = core::String;
+typedef B<unrelated X extends core::int> = core::String;
+typedef C<X extends core::int> = X;
 static method foo() → dynamic {
   core::String a;
 }
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect
index 2b7816b..221969e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.expect
@@ -29,9 +29,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<unrelated X extends core::int = core::int> = core::String;
-typedef B<unrelated X extends core::int = core::int> = core::String;
-typedef C<X extends core::int = core::int> = X;
+typedef A<unrelated X extends core::int> = core::String;
+typedef B<unrelated X extends core::int> = core::String;
+typedef C<X extends core::int> = X;
 static method foo() → dynamic {
   core::String a;
 }
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect
index 0649b07..9b82c3d 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.outline.expect
@@ -21,9 +21,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<unrelated X extends core::int = core::int> = core::String;
-typedef B<unrelated X extends core::int = core::int> = core::String;
-typedef C<X extends core::int = core::int> = X;
+typedef A<unrelated X extends core::int> = core::String;
+typedef B<unrelated X extends core::int> = core::String;
+typedef C<X extends core::int> = X;
 static method foo() → dynamic
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect
index 2b7816b..221969e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.transformed.expect
@@ -29,9 +29,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<unrelated X extends core::int = core::int> = core::String;
-typedef B<unrelated X extends core::int = core::int> = core::String;
-typedef C<X extends core::int = core::int> = X;
+typedef A<unrelated X extends core::int> = core::String;
+typedef B<unrelated X extends core::int> = core::String;
+typedef C<X extends core::int> = X;
 static method foo() → dynamic {
   core::String a;
 }
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.expect
index 381925d..2da2661 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.expect
@@ -20,13 +20,13 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef B<unrelated X extends core::String = core::String> = self2::A;
+typedef B<unrelated X extends core::String> = self2::A;
 class A extends core::Object {
   synthetic constructor •() → self2::A
     : super core::Object::•()
     ;
 }
-class C<Y extends self2::A = self2::A> extends core::Object {
+class C<Y extends self2::A> extends core::Object {
   synthetic constructor •() → self2::C<self2::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.transformed.expect
index 381925d..2da2661 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.strong.transformed.expect
@@ -20,13 +20,13 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef B<unrelated X extends core::String = core::String> = self2::A;
+typedef B<unrelated X extends core::String> = self2::A;
 class A extends core::Object {
   synthetic constructor •() → self2::A
     : super core::Object::•()
     ;
 }
-class C<Y extends self2::A = self2::A> extends core::Object {
+class C<Y extends self2::A> extends core::Object {
   synthetic constructor •() → self2::C<self2::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.expect
index 381925d..2da2661 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.expect
@@ -20,13 +20,13 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef B<unrelated X extends core::String = core::String> = self2::A;
+typedef B<unrelated X extends core::String> = self2::A;
 class A extends core::Object {
   synthetic constructor •() → self2::A
     : super core::Object::•()
     ;
 }
-class C<Y extends self2::A = self2::A> extends core::Object {
+class C<Y extends self2::A> extends core::Object {
   synthetic constructor •() → self2::C<self2::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.outline.expect
index ecbd101..9cbea69 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.outline.expect
@@ -21,12 +21,12 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef B<unrelated X extends core::String = core::String> = self2::A;
+typedef B<unrelated X extends core::String> = self2::A;
 class A extends core::Object {
   synthetic constructor •() → self2::A
     ;
 }
-class C<Y extends self2::A = self2::A> extends core::Object {
+class C<Y extends self2::A> extends core::Object {
   synthetic constructor •() → self2::C<self2::C::Y>
     ;
 }
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.transformed.expect
index 381925d..2da2661 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.transformed.expect
@@ -20,13 +20,13 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef B<unrelated X extends core::String = core::String> = self2::A;
+typedef B<unrelated X extends core::String> = self2::A;
 class A extends core::Object {
   synthetic constructor •() → self2::A
     : super core::Object::•()
     ;
 }
-class C<Y extends self2::A = self2::A> extends core::Object {
+class C<Y extends self2::A> extends core::Object {
   synthetic constructor •() → self2::C<self2::C::Y>
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.expect
index 0c361f8..d805d8c 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.transformed.expect
index 0c361f8..d805d8c 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.expect
index 0c361f8..d805d8c 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.outline.expect
index 67117f8..0b4358a 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%>
     ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.transformed.expect
index 0c361f8..d805d8c 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.transformed.expect
@@ -13,7 +13,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.expect
index afdc55d..98796c8 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.expect
@@ -21,7 +21,7 @@
 import "dart:core" as core;
 
 part ./unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart;
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart
   synthetic constructor •() → self2::C<self2::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.transformed.expect
index afdc55d..98796c8 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
 import "dart:core" as core;
 
 part ./unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart;
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart
   synthetic constructor •() → self2::C<self2::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.expect
index afdc55d..98796c8 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.expect
@@ -21,7 +21,7 @@
 import "dart:core" as core;
 
 part ./unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart;
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart
   synthetic constructor •() → self2::C<self2::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.outline.expect
index d3cc16c..ca7c9c2 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.outline.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 part ./unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart;
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart
   synthetic constructor •() → self2::C<self2::C::X%>
     ;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.transformed.expect
index afdc55d..98796c8 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
 import "dart:core" as core;
 
 part ./unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart;
-typedef A<X extends core::num = core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
 class C<X extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart
   synthetic constructor •() → self2::C<self2::C::X%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index dc7cac2..b9f3dfa 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 const_functions/const_functions_const_factory: VerificationError
+extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized
 extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized
 extension_types/simple_method_resolution: ExpectationFileMismatchSerialized
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31766.dart.weak.expect
index 84f19bf..9fcb7e6 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.weak.expect
@@ -20,11 +20,11 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  function bar<T extends self::A* = self::A*>(T* t) → void {
+  function bar<T extends self::A*>(T* t) → void {
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A*>(new self::A::•());
-  (<S extends self::A* = self::A*>(S* s) → Null {
+  (<S extends self::A*>(S* s) → Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.weak.transformed.expect
index 84f19bf..9fcb7e6 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.weak.transformed.expect
@@ -20,11 +20,11 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  function bar<T extends self::A* = self::A*>(T* t) → void {
+  function bar<T extends self::A*>(T* t) → void {
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A*>(new self::A::•());
-  (<S extends self::A* = self::A*>(S* s) → Null {
+  (<S extends self::A*>(S* s) → Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31846.dart.weak.expect
index 46e374c..98bf326 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.weak.expect
@@ -5,7 +5,7 @@
 static method main() → dynamic {
   core::print((#C1) is () →* dynamic);
   core::print((<T extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
-  core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::num*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.weak.transformed.expect
index 27bf019..4202e10 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.weak.transformed.expect
@@ -5,7 +5,7 @@
 static method main() → dynamic {
   core::print((#C1) is () →* dynamic);
   core::print((<T extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
-  core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::num*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.expect
index 86eda63..d05b36d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<U extends (self::C::T*) →* void = (self::C::T*) →* void>(self::C::f::U* x) → void {}
+  method f<U extends (self::C::T*) →* void>(self::C::f::U* x) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.outline.expect
index d92d1dd..713c4b7 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.outline.expect
@@ -6,7 +6,7 @@
 class C<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<U extends (self::C::T*) →* void = (self::C::T*) →* void>(self::C::f::U* x) → void
+  method f<U extends (self::C::T*) →* void>(self::C::f::U* x) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.transformed.expect
index 86eda63..d05b36d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<U extends (self::C::T*) →* void = (self::C::T*) →* void>(self::C::f::U* x) → void {}
+  method f<U extends (self::C::T*) →* void>(self::C::f::U* x) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.expect
index 415bac4..a1b22b2 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.expect
@@ -19,8 +19,8 @@
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
-  method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void {
+  method f<generic-covariant-impl U extends self::C::T*>(self::C::f::U* x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T*>() → void {
     this.{self::C::f}<self::C::g1::U*>(let final Never* #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
     this.f<U>(1.5);
               ^" in 1.5 as{TypeError} Never);
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.outline.expect
index 2cae248..133cc4d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.outline.expect
@@ -5,9 +5,9 @@
 class C<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void
+  method f<generic-covariant-impl U extends self::C::T*>(self::C::f::U* x) → void
     ;
-  method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void
+  method g1<generic-covariant-impl U extends self::C::T*>() → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.transformed.expect
index 415bac4..a1b22b2 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.transformed.expect
@@ -19,8 +19,8 @@
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
-  method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void {
+  method f<generic-covariant-impl U extends self::C::T*>(self::C::f::U* x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T*>() → void {
     this.{self::C::f}<self::C::g1::U*>(let final Never* #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
     this.f<U>(1.5);
               ^" in 1.5 as{TypeError} Never);
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.expect
index e202795..07dcc99 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
+  method f<generic-covariant-impl U extends self::C::T*>(self::C::f::U* x) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.outline.expect
index 8f33693..d66d1485 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 class C<T extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void
+  method f<generic-covariant-impl U extends self::C::T*>(self::C::f::U* x) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.transformed.expect
index e202795..07dcc99 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
+  method f<generic-covariant-impl U extends self::C::T*>(self::C::f::U* x) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.expect
index 4a4821f..eb1c927 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.expect
@@ -8,7 +8,7 @@
     ;
   method f(generic-covariant-impl self::B::T* x) → void {}
   method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
-  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void {}
+  method h<generic-covariant-impl U extends self::B::T*>() → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.outline.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.outline.expect
index 822b58a..2ebc576 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.outline.expect
@@ -9,7 +9,7 @@
     ;
   method g({generic-covariant-impl self::B::T* x}) → void
     ;
-  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void
+  method h<generic-covariant-impl U extends self::B::T*>() → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.transformed.expect
index 4a4821f..eb1c927 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method f(generic-covariant-impl self::B::T* x) → void {}
   method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
-  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void {}
+  method h<generic-covariant-impl U extends self::B::T*>() → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index c0d86e6..6403bd3 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -6,6 +6,8 @@
 # Kernel ASTs directly, that is, code in pkg/fasta/lib/src/kernel/ with
 # strong-mode enabled.
 
+extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
+extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_method_resolution: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 6b0b79c..c8b4bc7 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -6,6 +6,8 @@
 # the round trip for Kernel textual serialization where the initial binary
 # Kernel files are produced by compiling Dart code via Fasta.
 
+extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
+extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_method_resolution: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 9af0078..865813b 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -10,6 +10,8 @@
 general/error_recovery/issue_39058.crash: SemiFuzzFailure
 regress/utf_16_le_content.crash: SemiFuzzCrash
 
+extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
+extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_method_resolution: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 0e9346f..1e83f7d 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 62;
+  UInt32 formatVersion = 63;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -1496,7 +1496,7 @@
   Byte variance; // Index into the Variance enum above
   StringReference name; // Cosmetic, may be empty, not unique.
   DartType bound; // 'dynamic' if no explicit bound was given.
-  Option<DartType> defaultType; // type used when the parameter is not passed
+  DartType defaultType; // type used when the parameter is not passed
 }
 
 ```
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 100535a..eb7f26f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5901,7 +5901,7 @@
               getterType.typeParameters,
               getterType.typeParameters
                   .map((TypeParameter typeParameter) =>
-                      typeParameter.defaultType!)
+                      typeParameter.defaultType)
                   .toList());
         }
         return substitution.substituteType(getterType.returnType);
@@ -11979,13 +11979,18 @@
   /// bound.
   DartType bound;
 
+  /// Sentinel value used for the [defaultType] that has not yet been computed.
+  /// This is needed to make the [defaultType] field non-nullable while
+  /// supporting recursive bounds for which the default type need to be set
+  /// late.
+  static final DartType unsetDefaultTypeSentinel = new InvalidType();
+
   /// The default value of the type variable. It is used to provide the
   /// corresponding missing type argument in type annotations and as the
   /// fall-back type value in type inference at compile time. At run time,
   /// [defaultType] is used by the backends in place of the missing type
   /// argument of a dynamic invocation of a generic function.
-  // TODO(johnniwinther): Can we make this late non-nullable?
-  DartType? defaultType;
+  DartType defaultType;
 
   /// Describes variance of the type parameter w.r.t. declaration on which it is
   /// defined. For classes, if variance is not explicitly set, the type
@@ -12003,8 +12008,9 @@
 
   static const int legacyCovariantSerializationMarker = 4;
 
-  TypeParameter([this.name, DartType? bound, this.defaultType])
-      : bound = bound ?? unsetBoundSentinel;
+  TypeParameter([this.name, DartType? bound, DartType? defaultType])
+      : bound = bound ?? unsetBoundSentinel,
+        defaultType = defaultType ?? unsetDefaultTypeSentinel;
 
   // Must match serialized bit positions.
   static const int FlagGenericCovariantImpl = 1 << 0;
@@ -12042,7 +12048,7 @@
   void visitChildren(Visitor v) {
     visitList(annotations, v);
     bound.accept(v);
-    defaultType?.accept(v);
+    defaultType.accept(v);
   }
 
   @override
@@ -12052,8 +12058,9 @@
     if (bound != null) {
       bound = v.visitDartType(bound);
     }
+    // ignore: unnecessary_null_comparison
     if (defaultType != null) {
-      defaultType = v.visitDartType(defaultType!);
+      defaultType = v.visitDartType(defaultType);
     }
   }
 
@@ -12064,13 +12071,9 @@
     if (bound != null) {
       bound = v.visitDartType(bound, cannotRemoveSentinel);
     }
+    // ignore: unnecessary_null_comparison
     if (defaultType != null) {
-      DartType newDefaultType = v.visitDartType(defaultType!, dummyDartType);
-      if (identical(newDefaultType, dummyDartType)) {
-        defaultType = null;
-      } else {
-        defaultType = newDefaultType;
-      }
+      defaultType = v.visitDartType(defaultType, cannotRemoveSentinel);
     }
   }
 
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 7ed437e..a825278 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -3001,7 +3001,7 @@
     }
     node.name = readStringOrNullIfEmpty();
     node.bound = readDartType();
-    node.defaultType = readDartTypeOption();
+    node.defaultType = readDartType();
   }
 
   Arguments readArguments() {
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 6e4052a..c2c35282 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -2401,8 +2401,7 @@
     }
     writeStringReference(node.name ?? '');
     writeNode(node.bound);
-    // TODO(johnniwinther): Make this non-optional.
-    writeOptionalNode(node.defaultType);
+    writeNode(node.defaultType);
   }
 
   @override
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 752f84b..8fe71ec 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -174,7 +174,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 62;
+  static const int BinaryFormatVersion = 63;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 29a21e3..62b04d9 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -510,8 +510,9 @@
   visitTypeParameter(TypeParameter node) {
     TypeParameter newNode = typeParams[node]!;
     newNode.bound = visitType(node.bound);
+    // ignore: unnecessary_null_comparison
     if (node.defaultType != null) {
-      newNode.defaultType = visitType(node.defaultType!);
+      newNode.defaultType = visitType(node.defaultType);
     }
     return newNode
       ..annotations = cloneAnnotations && !node.annotations.isEmpty
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 47b03e6..d1cdd54 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -88,7 +88,7 @@
   void visitFunctionType(FunctionType node) {
     for (TypeParameter typeParameter in node.typeParameters) {
       typeParameter.bound.accept(this);
-      typeParameter.defaultType?.accept(this);
+      typeParameter.defaultType.accept(this);
     }
     for (DartType parameter in node.positionalParameters) {
       parameter.accept(this);
@@ -171,7 +171,7 @@
           ? const NeverType.nonNullable()
           : const DynamicType();
     } else if (bound is InterfaceType && bound.classNode == objectClass) {
-      DartType defaultType = typeParameters[i].defaultType!;
+      DartType defaultType = typeParameters[i].defaultType;
       if (!(defaultType is InterfaceType &&
           defaultType.classNode == objectClass)) {
         bound = isNonNullableByDefault && isContravariant
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index d18083c..fe27f5c 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -81,7 +81,7 @@
         }
         newTypeParameters[i].bound = newBound;
         DartType? newDefaultType = mergeTypes(
-            a.typeParameters[i].defaultType!, b.typeParameters[i].defaultType!);
+            a.typeParameters[i].defaultType, b.typeParameters[i].defaultType);
         if (newDefaultType == null) {
           return null;
         }
diff --git a/pkg/kernel/lib/src/printer.dart b/pkg/kernel/lib/src/printer.dart
index cb4b9e6..b184440 100644
--- a/pkg/kernel/lib/src/printer.dart
+++ b/pkg/kernel/lib/src/printer.dart
@@ -274,7 +274,7 @@
           return false;
         }
 
-        if (!isTopObject(bound) || isTopObject(typeParameter.defaultType!)) {
+        if (!isTopObject(bound) || isTopObject(typeParameter.defaultType)) {
           // Include explicit bounds only.
           _sb.write(' extends ');
           writeType(bound);
diff --git a/pkg/kernel/lib/src/replacement_visitor.dart b/pkg/kernel/lib/src/replacement_visitor.dart
index ced29bc..b37a704 100644
--- a/pkg/kernel/lib/src/replacement_visitor.dart
+++ b/pkg/kernel/lib/src/replacement_visitor.dart
@@ -26,7 +26,7 @@
       DartType? newBound = typeParameter.bound
           .accept1(this, Variance.combine(variance, Variance.invariant));
       DartType? newDefaultType = typeParameter.defaultType
-          ?.accept1(this, Variance.combine(variance, Variance.invariant));
+          .accept1(this, Variance.combine(variance, Variance.invariant));
       if (newBound != null || newDefaultType != null) {
         newTypeParameters ??= node.typeParameters.toList(growable: false);
         newTypeParameters[i] = new TypeParameter(
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index 550417c..47c4b89 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -112,6 +112,8 @@
         return relation.isTypedefRelated(s, t, this);
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
       }
     } else if (t is FunctionType) {
       const IsFunctionSubtypeOf relation = const IsFunctionSubtypeOf();
@@ -131,6 +133,8 @@
         return relation.isTypedefRelated(s, t, this);
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
       }
     } else if (t is TypeParameterType) {
       if (t.promotedBound == null) {
@@ -152,6 +156,8 @@
           return relation.isTypedefRelated(s, t, this);
         } else if (s is FutureOrType) {
           return relation.isFutureOrRelated(s, t, this);
+        } else if (s is ExtensionType) {
+          return relation.isExtensionRelated(s, t, this);
         }
       } else {
         const IsIntersectionSubtypeOf relation =
@@ -172,6 +178,8 @@
           return relation.isTypedefRelated(s, t, this);
         } else if (s is FutureOrType) {
           return relation.isFutureOrRelated(s, t, this);
+        } else if (s is ExtensionType) {
+          return relation.isExtensionRelated(s, t, this);
         }
       }
     } else if (t is TypedefType) {
@@ -192,6 +200,8 @@
         return relation.isTypedefRelated(s, t, this);
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
       }
     } else if (t is FutureOrType) {
       const IsFutureOrSubtypeOf relation = const IsFutureOrSubtypeOf();
@@ -211,6 +221,8 @@
         return relation.isTypedefRelated(s, t, this);
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
       }
     } else if (t is NullType) {
       const IsNullTypeSubtypeOf relation = const IsNullTypeSubtypeOf();
@@ -230,6 +242,8 @@
         return relation.isTypedefRelated(s, t, this);
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
       }
     } else if (t is NeverType) {
       const IsNeverTypeSubtypeOf relation = const IsNeverTypeSubtypeOf();
@@ -249,6 +263,30 @@
         return relation.isTypedefRelated(s, t, this);
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
+      }
+    } else if (t is ExtensionType) {
+      const IsExtensionTypeSubtypeOf relation =
+          const IsExtensionTypeSubtypeOf();
+      if (s is DynamicType) {
+        return relation.isDynamicRelated(s, t, this);
+      } else if (s is VoidType) {
+        return relation.isVoidRelated(s, t, this);
+      } else if (s is InterfaceType) {
+        return relation.isInterfaceRelated(s, t, this);
+      } else if (s is FunctionType) {
+        return relation.isFunctionRelated(s, t, this);
+      } else if (s is TypeParameterType) {
+        return s.promotedBound == null
+            ? relation.isTypeParameterRelated(s, t, this)
+            : relation.isIntersectionRelated(s, t, this);
+      } else if (s is TypedefType) {
+        return relation.isTypedefRelated(s, t, this);
+      } else if (s is FutureOrType) {
+        return relation.isFutureOrRelated(s, t, this);
+      } else if (s is ExtensionType) {
+        return relation.isExtensionRelated(s, t, this);
       }
     } else {
       throw "Unhandled type: ${t.runtimeType}";
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 84484e7..5066b0a 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2516,9 +2516,10 @@
     writeWord(getTypeParameterName(node));
     writeSpaced('extends');
     writeType(node.bound);
-    if (node.defaultType != null) {
+    // ignore: unnecessary_null_comparison
+    if (node.defaultType != node.bound) {
       writeSpaced('=');
-      writeType(node.defaultType!);
+      writeType(node.defaultType);
     }
   }
 
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 82aaee6..ac705f2 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -1195,20 +1195,20 @@
     zipTypeParameterDefaultType,
     unzipTypeParameterDefaultType);
 
-TypeParameter zipTypeParameterBound(TypeParameter node, DartType? bound) {
-  return node..bound = bound!;
+TypeParameter zipTypeParameterBound(TypeParameter node, DartType bound) {
+  return node..bound = bound;
 }
 
-Tuple2<TypeParameter, DartType?> unzipTypeParameterBound(TypeParameter node) {
+Tuple2<TypeParameter, DartType> unzipTypeParameterBound(TypeParameter node) {
   return new Tuple2(node, node.bound);
 }
 
 TypeParameter zipTypeParameterDefaultType(
-    TypeParameter node, DartType? defaultType) {
+    TypeParameter node, DartType defaultType) {
   return node..defaultType = defaultType;
 }
 
-Tuple2<TypeParameter, DartType?> unzipTypeParameterDefaultType(
+Tuple2<TypeParameter, DartType> unzipTypeParameterDefaultType(
     TypeParameter node) {
   return new Tuple2(node, node.defaultType);
 }
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index d40825c..c273494 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -121,9 +121,7 @@
     TypeParameter freshTypeParameter = freshParameters[i];
 
     freshTypeParameter.bound = substitute(typeParameter.bound, map);
-    freshTypeParameter.defaultType = typeParameter.defaultType != null
-        ? substitute(typeParameter.defaultType!, map)
-        : null;
+    freshTypeParameter.defaultType = substitute(typeParameter.defaultType, map);
     freshTypeParameter.variance =
         typeParameter.isLegacyCovariant ? null : typeParameter.variance;
     // Annotations on a type parameter are specific to the declaration of the
@@ -384,8 +382,9 @@
     TypeParameterType typeParameterType = substitution[node] =
         new TypeParameterType.forAlphaRenaming(node, fresh);
     fresh.bound = visit(node.bound);
+    // ignore: unnecessary_null_comparison
     if (node.defaultType != null) {
-      fresh.defaultType = visit(node.defaultType!);
+      fresh.defaultType = visit(node.defaultType);
     }
     // If the bound was changed from substituting the bound we need to update
     // implicit nullability to be based on the new bound. If the bound wasn't
@@ -701,8 +700,9 @@
   bool handleTypeParameter(TypeParameter node) {
     assert(!variables.contains(node));
     if (node.bound.accept(this)) return true;
+    // ignore: unnecessary_null_comparison
     if (node.defaultType == null) return false;
-    return node.defaultType!.accept(this);
+    return node.defaultType.accept(this);
   }
 }
 
@@ -760,8 +760,9 @@
   bool handleTypeParameter(TypeParameter node) {
     assert(variables.contains(node));
     if (node.bound.accept(this)) return true;
+    // ignore: unnecessary_null_comparison
     if (node.defaultType == null) return false;
-    return node.defaultType!.accept(this);
+    return node.defaultType.accept(this);
   }
 }
 
@@ -819,8 +820,9 @@
   bool handleTypeParameter(TypeParameter node) {
     assert(variables.contains(node));
     if (node.bound.accept(this)) return true;
+    // ignore: unnecessary_null_comparison
     if (node.defaultType == null) return false;
-    return node.defaultType!.accept(this);
+    return node.defaultType.accept(this);
   }
 }
 
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 01e2f7d..ad79a99 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -186,7 +186,8 @@
         problem(
             currentParent, "Missing bound for type parameter '$parameter'.");
       }
-      if (parameter.defaultType == null) {
+      if (identical(
+          parameter.defaultType, TypeParameter.unsetDefaultTypeSentinel)) {
         problem(currentParent,
             "Missing default type for type parameter '$parameter'.");
       }
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index dc68f05..65b263d 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -338,7 +338,8 @@
       {Supertype extends_(List<DartType> typeParameterTypes),
       List<Supertype> implements_(List<DartType> typeParameterTypes)}) {
     var typeParameters = typeParameterNames
-        .map((name) => new TypeParameter(name, coreTypes.objectLegacyRawType))
+        .map((name) => new TypeParameter(
+            name, coreTypes.objectLegacyRawType, coreTypes.objectLegacyRawType))
         .toList();
     var typeParameterTypes = typeParameters
         .map(
@@ -581,7 +582,8 @@
 
     var a = addGenericClass('A', ['T', 'U']);
 
-    var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
+    var bT = new TypeParameter(
+        'T', coreTypes.objectLegacyRawType, coreTypes.objectLegacyRawType);
     var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
@@ -613,7 +615,8 @@
 
     var a = addGenericClass('A', ['T', 'U']);
 
-    var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
+    var bT = new TypeParameter(
+        'T', coreTypes.objectLegacyRawType, coreTypes.objectLegacyRawType);
     var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
@@ -651,7 +654,8 @@
 
     var a = addGenericClass('A', ['T', 'U']);
 
-    var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
+    var bT = new TypeParameter(
+        'T', coreTypes.objectLegacyRawType, coreTypes.objectLegacyRawType);
     var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
@@ -1327,7 +1331,8 @@
 
     var a = addGenericClass('A', ['T', 'U']);
 
-    var bT = new TypeParameter('T', coreTypes.objectLegacyRawType);
+    var bT = new TypeParameter(
+        'T', coreTypes.objectLegacyRawType, coreTypes.objectLegacyRawType);
     var bTT = new TypeParameterType(bT, Nullability.legacy);
     var b = addClass(new Class(
         name: 'B',
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index 96eea1d..625d97f 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -14,7 +14,7 @@
 t6* = _Call direct [#lib::bar] ()
 t7* = _Call direct [#lib::foo] ()
 t8 = _Join [dynamic] (_T (dart.core::bool, true), t7)
-t9 = _TypeCheck (t8 against dart.core::bool*) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as dart.core::bool*)
+t9 = _TypeCheck (t8 against dart.core::bool*) (for (x ?{dynamic} true : #lib::foo()) as dart.core::bool*)
 t10* = _Call direct [#lib::bar] ()
 t11* = _Call direct [#lib::bar] ()
 t12* = _Call direct [#lib::foo] ()
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index f87c06e..a7fe16d 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -463,11 +463,8 @@
   THR_Print("  live range v%" Pd " [%" Pd ", %" Pd ") in ", vreg(), Start(),
             End());
   assigned_location().Print();
-  if (spill_slot_.HasStackIndex()) {
-    const intptr_t stack_slot =
-        -compiler::target::frame_layout.VariableIndexForFrameSlot(
-            spill_slot_.stack_index());
-    THR_Print(" allocated spill slot: %" Pd "", stack_slot);
+  if (!spill_slot_.IsInvalid() && !spill_slot_.IsConstant()) {
+    THR_Print(" assigned spill slot: %s", spill_slot_.ToCString());
   }
   THR_Print("\n");
 
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index aff6de7..5d5890f 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -169,10 +169,8 @@
 
   helper.ReadUntilExcluding(TypeParameterHelper::kBound);
   // The helper isn't needed after this point.
-  CalculateDartTypeFingerprint();
-  if (ReadTag() == kSomething) {
-    CalculateDartTypeFingerprint();
-  }
+  CalculateDartTypeFingerprint();  // read bound
+  CalculateDartTypeFingerprint();  // read default type
   BuildHash(helper.flags_);
 }
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 4ede221..5808db3 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -927,9 +927,7 @@
         helper_->SkipDartType();
         break;
       case kDefaultType:
-        if (helper_->ReadTag() == kSomething) {
-          helper_->SkipDartType();
-        }
+        helper_->SkipDartType();
         break;
       case kEnd:
         return;
@@ -3393,11 +3391,8 @@
     AbstractType& bound = BuildTypeWithoutFinalization();  // read ith bound.
     parameter.set_bound(bound);
     helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
-    const AbstractType* default_arg = &Object::dynamic_type();
-    if (helper_->ReadTag() == kSomething) {
-      default_arg = &BuildTypeWithoutFinalization();
-    }
-    parameter.set_default_argument(*default_arg);
+    AbstractType& default_arg = BuildTypeWithoutFinalization();
+    parameter.set_default_argument(default_arg);
     helper.Finish();
   }
 
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index e2be4a9..81730a0 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -538,9 +538,7 @@
     helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
     VisitDartType();  // read ith bound.
     helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kDefaultType);
-    if (helper_.ReadTag() == kSomething) {
-      VisitDartType();  // read ith default type.
-    }
+    VisitDartType();  // read ith default type.
     helper.Finish();
   }
   function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
@@ -1357,9 +1355,7 @@
       VisitDartType();  // read bound.
       helper.ReadUntilExcludingAndSetJustRead(
           TypeParameterHelper::kDefaultType);
-      if (helper_.ReadTag() == kSomething) {
-        VisitDartType();  // read default type.
-      }
+      VisitDartType();  // read default type.
       helper.Finish();
     }
     helper_.ReadUInt();  // read required parameter count.
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 6259fe8..38ca8fa 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 62;
-static const uint32_t kMaxSupportedKernelFormatVersion = 62;
+static const uint32_t kMinSupportedKernelFormatVersion = 63;
+static const uint32_t kMaxSupportedKernelFormatVersion = 63;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/v8_snapshot_writer.cc b/runtime/vm/v8_snapshot_writer.cc
index 351c831..6fb5898 100644
--- a/runtime/vm/v8_snapshot_writer.cc
+++ b/runtime/vm/v8_snapshot_writer.cc
@@ -29,6 +29,8 @@
   idx = edge_types_.Add("internal");
   ASSERT_EQUAL(idx, static_cast<intptr_t>(Edge::Type::kInternal));
 
+  unknown_type_string_index_ = node_types_.Add("Unknown");
+
   SetObjectTypeAndName(kArtificialRootId, "ArtificialRoot",
                        "<artificial root>");
 }
@@ -111,10 +113,14 @@
 
 void V8SnapshotProfileWriter::NodeInfo::Write(JSONWriter* writer) const {
   ASSERT(id.space() != IdSpace::kInvalid);
+  ASSERT(type != kInvalidString);
   if (type == kInvalidString) {
-    FATAL("No type given for node %s", id.ToCString(profile_writer_->zone_));
+    // Fall back on this string in non-DEBUG modes. See
+    // https://github.com/dart-lang/sdk/issues/45787 for context.
+    writer->PrintValue(profile_writer_->unknown_type_string_index_);
+  } else {
+    writer->PrintValue(type);
   }
-  writer->PrintValue(type);
   if (name != kInvalidString) {
     writer->PrintValue(name);
   } else {
diff --git a/runtime/vm/v8_snapshot_writer.h b/runtime/vm/v8_snapshot_writer.h
index ea844ce..9aededc 100644
--- a/runtime/vm/v8_snapshot_writer.h
+++ b/runtime/vm/v8_snapshot_writer.h
@@ -325,12 +325,13 @@
     }
   };
 
-  Zone* zone_;
+  Zone* const zone_;
   DirectChainedHashMap<ObjectIdToNodeInfoTraits> nodes_;
   StringsTable node_types_;
   StringsTable edge_types_;
   StringsTable strings_;
   DirectChainedHashMap<ObjectIdSetKeyValueTrait> roots_;
+  intptr_t unknown_type_string_index_;
 #endif
 };
 
diff --git a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
index 9ff7eb0..1ee9ec6 100644
--- a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
+++ b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
@@ -9,8 +9,8 @@
 class C1 {
   int? bad;
   //   ^^^
-  // [context 22] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 48] 'bad' refers to a property so it couldn't be promoted.
+  // [context 21] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 50] 'bad' refers to a property so it couldn't be promoted.
   f(int i) {}
 }
 
@@ -18,16 +18,16 @@
   if (c.bad == null) return;
   c.f(c.bad);
   //  ^^^^^
-  // [analyzer 22] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 21] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
-  // [cfe 48] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 50] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C2 {
   int? bad;
   //   ^^^
-  // [context 39] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 49] 'bad' refers to a property so it couldn't be promoted.
+  // [context 43] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 51] 'bad' refers to a property so it couldn't be promoted.
   f([int i = 0]) {}
 }
 
@@ -35,16 +35,16 @@
   if (c.bad == null) return;
   c.f(c.bad);
   //  ^^^^^
-  // [analyzer 39] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 43] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
-  // [cfe 49] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 51] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C3 {
   int? bad;
   //   ^^^
-  // [context 6] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 50] 'bad' refers to a property so it couldn't be promoted.
+  // [context 9] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 52] 'bad' refers to a property so it couldn't be promoted.
   f({required int i}) {}
 }
 
@@ -52,16 +52,16 @@
   if (c.bad == null) return;
   c.f(i: c.bad);
   //     ^^^^^
-  // [analyzer 6] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 9] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 50] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 52] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C4 {
   int? bad;
   //   ^^^
-  // [context 15] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 51] 'bad' refers to a property so it couldn't be promoted.
+  // [context 17] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 53] 'bad' refers to a property so it couldn't be promoted.
   f({int i = 0}) {}
 }
 
@@ -69,16 +69,16 @@
   if (c.bad == null) return;
   c.f(i: c.bad);
   //     ^^^^^
-  // [analyzer 15] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 17] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 51] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 53] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C5 {
   List<int>? bad;
   //         ^^^
-  // [context 37] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 52] 'bad' refers to a property so it couldn't be promoted.
+  // [context 39] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 54] 'bad' refers to a property so it couldn't be promoted.
   f<T>(List<T> x) {}
 }
 
@@ -86,16 +86,16 @@
   if (c.bad == null) return;
   c.f(c.bad);
   //  ^^^^^
-  // [analyzer 37] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 39] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
-  // [cfe 52] The argument type 'List<int>?' can't be assigned to the parameter type 'List<int>' because 'List<int>?' is nullable and 'List<int>' isn't.
+  // [cfe 54] The argument type 'List<int>?' can't be assigned to the parameter type 'List<int>' because 'List<int>?' is nullable and 'List<int>' isn't.
 }
 
 class C6 {
   int? bad;
   //   ^^^
-  // [context 4] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 53] 'bad' refers to a property so it couldn't be promoted.
+  // [context 5] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 55] 'bad' refers to a property so it couldn't be promoted.
   C6(int i);
 }
 
@@ -103,16 +103,16 @@
   if (c.bad == null) return null;
   return C6(c.bad);
   //        ^^^^^
-  // [analyzer 4] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 5] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //          ^
-  // [cfe 53] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 55] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C7 {
   int? bad;
   //   ^^^
   // [context 25] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 54] 'bad' refers to a property so it couldn't be promoted.
+  // [context 56] 'bad' refers to a property so it couldn't be promoted.
   C7(int i);
 }
 
@@ -122,23 +122,23 @@
   //            ^^^^^
   // [analyzer 25] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //              ^
-  // [cfe 54] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 56] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C8 {
   int? bad;
   //   ^^^
-  // [context 32] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 55] 'bad' refers to a property so it couldn't be promoted.
+  // [context 35] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 57] 'bad' refers to a property so it couldn't be promoted.
 }
 
 userDefinableBinaryOpRhs(C8 c) {
   if (c.bad == null) return;
   1 + c.bad;
   //  ^^^^^
-  // [analyzer 32] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 35] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
-  // [cfe 55] A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
+  // [cfe 57] A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 }
 
 class C9 {
@@ -180,10 +180,10 @@
 class C11 {
   bool? bad;
   //    ^^^
-  // [context 13] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 18] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 56] 'bad' refers to a property so it couldn't be promoted.
-  // [context 57] 'bad' refers to a property so it couldn't be promoted.
+  // [context 15] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 19] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 58] 'bad' refers to a property so it couldn't be promoted.
+  // [context 59] 'bad' refers to a property so it couldn't be promoted.
   f(bool b) {}
 }
 
@@ -191,23 +191,23 @@
   if (c.bad == null) return;
   c.f(c.bad && b);
   //  ^^^^^
-  // [analyzer 18] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 19] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
-  // [cfe 56] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 58] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   c.f(b && c.bad);
   //       ^^^^^
-  // [analyzer 13] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 15] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
-  // [cfe 57] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 59] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C12 {
   bool? bad;
   //    ^^^
-  // [context 5] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 36] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 58] 'bad' refers to a property so it couldn't be promoted.
-  // [context 59] 'bad' refers to a property so it couldn't be promoted.
+  // [context 6] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 37] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 60] 'bad' refers to a property so it couldn't be promoted.
+  // [context 61] 'bad' refers to a property so it couldn't be promoted.
   f(bool b) {}
 }
 
@@ -215,51 +215,51 @@
   if (c.bad == null) return;
   c.f(c.bad || b);
   //  ^^^^^
-  // [analyzer 5] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 6] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
-  // [cfe 58] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 60] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   c.f(b || c.bad);
   //       ^^^^^
-  // [analyzer 36] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 37] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
-  // [cfe 59] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 61] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C13 {
   bool? bad;
   //    ^^^
-  // [context 2] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 60] 'bad' refers to a property so it couldn't be promoted.
+  // [context 3] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 62] 'bad' refers to a property so it couldn't be promoted.
 }
 
 assertStatementCondition(C13 c) {
   if (c.bad == null) return;
   assert(c.bad);
   //     ^^^^^
-  // [analyzer 2] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 3] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //       ^
-  // [cfe 60] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 62] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C14 {
   bool? bad;
   //    ^^^
-  // [context 8] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 61] 'bad' refers to a property so it couldn't be promoted.
+  // [context 10] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 63] 'bad' refers to a property so it couldn't be promoted.
   C14.assertInitializerCondition(C14 c)
       : bad = c.bad!,
         assert(c.bad);
         //     ^^^^^
-        // [analyzer 8] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+        // [analyzer 10] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
         //       ^
-        // [cfe 61] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+        // [cfe 63] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C15 {
   bool? bad;
   //    ^^^
-  // [context 47] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 62] 'bad' refers to a property so it couldn't be promoted.
+  // [context 49] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 64] 'bad' refers to a property so it couldn't be promoted.
   f(bool b) {}
 }
 
@@ -267,53 +267,53 @@
   if (c.bad == null) return;
   c.f(!c.bad);
   //   ^^^^^
-  // [analyzer 47] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 49] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //     ^
-  // [cfe 62] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 64] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C16 {
   bool? bad;
   //    ^^^
-  // [context 9] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 11] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 12] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 16] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 17] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 19] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 63] 'bad' refers to a property so it couldn't be promoted.
-  // [context 64] 'bad' refers to a property so it couldn't be promoted.
+  // [context 20] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 65] 'bad' refers to a property so it couldn't be promoted.
   // [context 66] 'bad' refers to a property so it couldn't be promoted.
+  // [context 67] 'bad' refers to a property so it couldn't be promoted.
+  // [context 68] 'bad' refers to a property so it couldn't be promoted.
 }
 
 forLoopCondition(C16 c) {
   if (c.bad == null) return;
   for (; c.bad;) {}
   //     ^^^^^
-  // [analyzer 9] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 12] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //       ^
-  // [cfe 63] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 65] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   [for (; c.bad;) null];
   //      ^^^^^
-  // [analyzer 17] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 20] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //        ^
-  // [cfe 64] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 66] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({for (; c.bad;) null});
   //       ^^^^^
-  // [analyzer 19] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
-  //         ^
-  // [cfe 65] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
-  ({for (; c.bad;) null: null});
-  //       ^^^^^
   // [analyzer 16] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
-  // [cfe 66] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 67] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  ({for (; c.bad;) null: null});
+  //       ^^^^^
+  // [analyzer 11] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  //         ^
+  // [cfe 68] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C17 {
   bool? bad;
   //    ^^^
-  // [context 46] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 67] 'bad' refers to a property so it couldn't be promoted.
+  // [context 33] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 69] 'bad' refers to a property so it couldn't be promoted.
   f(int i) {}
 }
 
@@ -321,38 +321,38 @@
   if (c.bad == null) return;
   c.f(c.bad ? 1 : 2);
   //  ^^^^^
-  // [analyzer 46] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 33] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
-  // [cfe 67] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 69] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C18 {
   bool? bad;
   //    ^^^
-  // [context 7] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 68] 'bad' refers to a property so it couldn't be promoted.
+  // [context 8] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 70] 'bad' refers to a property so it couldn't be promoted.
 }
 
 doLoopCondition(C18 c) {
   if (c.bad == null) return;
   do {} while (c.bad);
   //           ^^^^^
-  // [analyzer 7] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 8] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //             ^
-  // [cfe 68] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 70] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C19 {
   bool? bad;
   //    ^^^
-  // [context 11] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 12] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 13] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 23] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 28] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 69] 'bad' refers to a property so it couldn't be promoted.
-  // [context 70] 'bad' refers to a property so it couldn't be promoted.
+  // [context 30] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 71] 'bad' refers to a property so it couldn't be promoted.
   // [context 72] 'bad' refers to a property so it couldn't be promoted.
+  // [context 73] 'bad' refers to a property so it couldn't be promoted.
+  // [context 74] 'bad' refers to a property so it couldn't be promoted.
 }
 
 ifCondition(C19 c) {
@@ -361,167 +361,167 @@
   //  ^^^^^
   // [analyzer 23] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
-  // [cfe 69] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 71] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   [if (c.bad) null];
   //   ^^^^^
-  // [analyzer 28] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 30] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //     ^
-  // [cfe 70] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 72] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({if (c.bad) null});
   //    ^^^^^
-  // [analyzer 11] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 28] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //      ^
-  // [cfe 71] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 73] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({if (c.bad) null: null});
   //    ^^^^^
-  // [analyzer 12] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 13] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //      ^
-  // [cfe 72] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 74] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C20 {
   bool? bad;
   //    ^^^
-  // [context 21] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 73] 'bad' refers to a property so it couldn't be promoted.
+  // [context 22] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 75] 'bad' refers to a property so it couldn't be promoted.
 }
 
 whileCondition(C20 c) {
   if (c.bad == null) return;
   while (c.bad) {}
   //     ^^^^^
-  // [analyzer 21] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 22] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //       ^
-  // [cfe 73] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
+  // [cfe 75] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
 
 class C21 {
   int? bad;
   //   ^^^
-  // [context 45] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 74] 'bad' refers to a property so it couldn't be promoted.
+  // [context 46] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 76] 'bad' refers to a property so it couldn't be promoted.
 }
 
 assignmentRhs(C21 c, int i) {
   if (c.bad == null) return;
   i = c.bad;
   //  ^^^^^
-  // [analyzer 45] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 46] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //    ^
-  // [cfe 74] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 76] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C22 {
   int? bad;
   //   ^^^
-  // [context 43] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 75] 'bad' refers to a property so it couldn't be promoted.
+  // [context 44] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 77] 'bad' refers to a property so it couldn't be promoted.
 }
 
 variableInitializer(C22 c) {
   if (c.bad == null) return;
   int i = c.bad;
   //      ^^^^^
-  // [analyzer 43] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 44] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //        ^
-  // [cfe 75] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 77] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C23 {
   int? bad;
   //   ^^^
-  // [context 24] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 76] 'bad' refers to a property so it couldn't be promoted.
+  // [context 26] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 78] 'bad' refers to a property so it couldn't be promoted.
   final int x;
   final int y;
   C23.constructorInitializer(C23 c)
       : x = c.bad!,
         y = c.bad;
         //  ^^^^^
-        // [analyzer 24] COMPILE_TIME_ERROR.FIELD_INITIALIZER_NOT_ASSIGNABLE
+        // [analyzer 26] COMPILE_TIME_ERROR.FIELD_INITIALIZER_NOT_ASSIGNABLE
         //    ^
-        // [cfe 76] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+        // [cfe 78] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C24 {
   int? bad;
   //   ^^^
-  // [context 3] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 30] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 33] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 4] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 34] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 77] 'bad' refers to a property so it couldn't be promoted.
-  // [context 78] 'bad' refers to a property so it couldn't be promoted.
+  // [context 36] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 38] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 79] 'bad' refers to a property so it couldn't be promoted.
   // [context 80] 'bad' refers to a property so it couldn't be promoted.
+  // [context 81] 'bad' refers to a property so it couldn't be promoted.
+  // [context 82] 'bad' refers to a property so it couldn't be promoted.
 }
 
 forVariableInitializer(C24 c) {
   if (c.bad == null) return;
   for (int i = c.bad; false;) {}
   //           ^^^^^
-  // [analyzer 34] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 36] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //             ^
-  // [cfe 77] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 79] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   [for (int i = c.bad; false;) null];
   //            ^^^^^
-  // [analyzer 33] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 38] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //              ^
-  // [cfe 78] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 80] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (int i = c.bad; false;) null});
   //             ^^^^^
-  // [analyzer 30] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 34] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
-  // [cfe 79] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 81] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (int i = c.bad; false;) null: null});
   //             ^^^^^
-  // [analyzer 3] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 4] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
-  // [cfe 80] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 82] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C25 {
   int? bad;
   //   ^^^
-  // [context 35] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 31] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 40] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 41] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 44] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 81] 'bad' refers to a property so it couldn't be promoted.
-  // [context 82] 'bad' refers to a property so it couldn't be promoted.
+  // [context 45] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 83] 'bad' refers to a property so it couldn't be promoted.
   // [context 84] 'bad' refers to a property so it couldn't be promoted.
+  // [context 85] 'bad' refers to a property so it couldn't be promoted.
+  // [context 86] 'bad' refers to a property so it couldn't be promoted.
 }
 
 forAssignmentInitializer(C25 c, int i) {
   if (c.bad == null) return;
   for (i = c.bad; false;) {}
   //       ^^^^^
-  // [analyzer 35] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 31] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //         ^
-  // [cfe 81] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 83] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   [for (i = c.bad; false;) null];
   //        ^^^^^
-  // [analyzer 44] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 45] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
-  // [cfe 82] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 84] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (i = c.bad; false;) null});
   //         ^^^^^
   // [analyzer 40] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
-  // [cfe 83] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 85] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (i = c.bad; false;) null: null});
   //         ^^^^^
   // [analyzer 41] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
-  // [cfe 84] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 86] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C26 {
   int? bad;
   //   ^^^
-  // [context 26] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 85] 'bad' refers to a property so it couldn't be promoted.
+  // [context 27] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 87] 'bad' refers to a property so it couldn't be promoted.
 }
 
 compoundAssignmentRhs(C26 c) {
@@ -529,119 +529,119 @@
   if (c.bad == null) return;
   n += c.bad;
   //   ^^^^^
-  // [analyzer 26] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 27] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //     ^
-  // [cfe 85] A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
+  // [cfe 87] A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 }
 
 class C27 {
   int? bad;
   //   ^^^
-  // [context 38] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 86] 'bad' refers to a property so it couldn't be promoted.
+  // [context 42] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 88] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexGet(C27 c, List<int> values) {
   if (c.bad == null) return;
   values[c.bad];
   //     ^^^^^
-  // [analyzer 38] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 42] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 86] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 88] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C28 {
   int? bad;
   //   ^^^
-  // [context 31] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 87] 'bad' refers to a property so it couldn't be promoted.
+  // [context 7] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 89] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSet(C28 c, List<int> values) {
   if (c.bad == null) return;
   values[c.bad] = 0;
   //     ^^^^^
-  // [analyzer 31] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 7] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 87] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 89] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C29 {
   int? bad;
   //   ^^^
-  // [context 14] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 88] 'bad' refers to a property so it couldn't be promoted.
+  // [context 18] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 90] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetCompound(C29 c, List<int> values) {
   if (c.bad == null) return;
   values[c.bad] += 1;
   //     ^^^^^
-  // [analyzer 14] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 18] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 88] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 90] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C30 {
   int? bad;
   //   ^^^
-  // [context 27] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 89] 'bad' refers to a property so it couldn't be promoted.
+  // [context 29] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 91] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetIfNull(C30 c, List<int?> values) {
   if (c.bad == null) return;
   values[c.bad] ??= 1;
   //     ^^^^^
-  // [analyzer 27] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 29] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 89] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 91] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C31 {
   int? bad;
   //   ^^^
   // [context 1] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 20] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 90] 'bad' refers to a property so it couldn't be promoted.
-  // [context 91] 'bad' refers to a property so it couldn't be promoted.
+  // [context 14] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 92] 'bad' refers to a property so it couldn't be promoted.
+  // [context 93] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetPreIncDec(C31 c, List<int> values) {
   if (c.bad == null) return;
   ++values[c.bad];
   //       ^^^^^
-  // [analyzer 20] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 14] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //         ^
-  // [cfe 90] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 92] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   --values[c.bad];
   //       ^^^^^
   // [analyzer 1] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //         ^
-  // [cfe 91] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 93] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C32 {
   int? bad;
   //   ^^^
-  // [context 29] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 42] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 92] 'bad' refers to a property so it couldn't be promoted.
-  // [context 93] 'bad' refers to a property so it couldn't be promoted.
+  // [context 32] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 48] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 94] 'bad' refers to a property so it couldn't be promoted.
+  // [context 95] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetPostIncDec(C32 c, List<int> values) {
   if (c.bad == null) return;
   values[c.bad]++;
   //     ^^^^^
-  // [analyzer 29] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 32] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 92] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 94] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   values[c.bad]--;
   //     ^^^^^
-  // [analyzer 42] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 48] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe 93] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 95] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 extension E33 on int {
@@ -651,15 +651,50 @@
 class C33 {
   int? bad;
   //   ^^^
-  // [context 10] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 94] 'bad' refers to a property so it couldn't be promoted.
+  // [context 24] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 96] 'bad' refers to a property so it couldn't be promoted.
 }
 
 explicitExtensionInvocation(C33 c) {
   if (c.bad == null) return;
   E33(c.bad).f();
   //  ^^^^^
-  // [analyzer 10] COMPILE_TIME_ERROR.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE
+  // [analyzer 24] COMPILE_TIME_ERROR.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE
   //    ^
-  // [cfe 94] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 96] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+}
+
+class C34 {
+  int? bad;
+  //   ^^^
+  // [context 47] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 97] 'bad' refers to a property so it couldn't be promoted.
+  C34(int value);
+}
+
+class D34 extends C34 {
+  int other;
+  D34(C34 c)
+      : other = c.bad!,
+        super(c.bad);
+        //    ^^^^^
+        // [analyzer 47] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+        //      ^
+        // [cfe 97] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
+}
+
+class C35 {
+  int? bad;
+  //   ^^^
+  // [context 2] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 98] 'bad' refers to a property so it couldn't be promoted.
+}
+
+indexSetRhs(C35 c, List<int> x) {
+  if (c.bad == null) return;
+  x[0] = c.bad;
+  //     ^^^^^
+  // [analyzer 2] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  //       ^
+  // [cfe 98] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
diff --git a/tools/VERSION b/tools/VERSION
index 67a7f7b..e394531 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 24
+PRERELEASE 25
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/linux_dist_support/create_tarball.py b/tools/linux_dist_support/create_tarball.py
index 10eb73c..f5fc1bc 100755
--- a/tools/linux_dist_support/create_tarball.py
+++ b/tools/linux_dist_support/create_tarball.py
@@ -60,7 +60,6 @@
     'docs',
     'fuchsia',
     'parser_testcases',
-    'test',
     'testcases',
     'tests',
 ]