[cfe] Make TypeBuilder sealed

This changes the TypeBuilder to be a sealed class and changes
implementation to use exhaustive switch, including fixes for all
missing cases found.

Change-Id: I24436801c93ee43858d35ed6b396489fd13125be
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/322960
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
index 196e647..a171a3d 100644
--- a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
@@ -8,18 +8,17 @@
 import '../problems.dart';
 import '../source/source_library_builder.dart';
 import 'library_builder.dart';
-import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
-class FixedTypeBuilder extends TypeBuilder {
+class FixedTypeBuilderImpl extends FixedTypeBuilder {
   final DartType type;
   @override
   final Uri? fileUri;
   @override
   final int? charOffset;
 
-  const FixedTypeBuilder(this.type, this.fileUri, this.charOffset);
+  const FixedTypeBuilderImpl(this.type, this.fileUri, this.charOffset);
 
   @override
   TypeBuilder clone(
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index accc9f0..fc086a3 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -28,7 +28,6 @@
 import 'library_builder.dart';
 import 'metadata_builder.dart';
 import 'modifier_builder.dart';
-import 'named_type_builder.dart';
 import 'omitted_type_builder.dart';
 import 'type_builder.dart';
 import 'variable_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index 584691b..58808e1 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -13,15 +13,18 @@
 import '../kernel/implicit_field_type.dart';
 import '../source/source_library_builder.dart';
 import 'formal_parameter_builder.dart';
+import 'inferable_type_builder.dart';
 import 'library_builder.dart';
-import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 import 'type_variable_builder.dart';
 
-abstract class FunctionTypeBuilder extends TypeBuilder {
+abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
+  @override
   final TypeBuilder returnType;
+  @override
   final List<TypeVariableBuilder>? typeVariables;
+  @override
   final List<ParameterBuilder>? formals;
   @override
   final NullabilityBuilder nullabilityBuilder;
@@ -30,7 +33,7 @@
   @override
   final int charOffset;
 
-  factory FunctionTypeBuilder(
+  factory FunctionTypeBuilderImpl(
       TypeBuilder returnType,
       List<TypeVariableBuilder>? typeVariables,
       List<ParameterBuilder>? formals,
@@ -64,7 +67,7 @@
             nullabilityBuilder, fileUri, charOffset);
   }
 
-  FunctionTypeBuilder._(this.returnType, this.typeVariables, this.formals,
+  FunctionTypeBuilderImpl._(this.returnType, this.typeVariables, this.formals,
       this.nullabilityBuilder, this.fileUri, this.charOffset);
 
   @override
@@ -190,7 +193,7 @@
         return formal.clone(newTypes, contextLibrary, contextDeclaration);
       }, growable: false);
     }
-    return new FunctionTypeBuilder(
+    return new FunctionTypeBuilderImpl(
         returnType.clone(newTypes, contextLibrary, contextDeclaration),
         clonedTypeVariables,
         clonedFormals,
@@ -202,7 +205,7 @@
   @override
   FunctionTypeBuilder withNullabilityBuilder(
       NullabilityBuilder nullabilityBuilder) {
-    return new FunctionTypeBuilder(returnType, typeVariables, formals,
+    return new FunctionTypeBuilderImpl(returnType, typeVariables, formals,
         nullabilityBuilder, fileUri, charOffset);
   }
 }
@@ -211,7 +214,7 @@
 ///
 /// This is the normal function type whose return type or parameter types are
 /// either explicit or omitted.
-class _ExplicitFunctionTypeBuilder extends FunctionTypeBuilder {
+class _ExplicitFunctionTypeBuilder extends FunctionTypeBuilderImpl {
   _ExplicitFunctionTypeBuilder(
       TypeBuilder returnType,
       List<TypeVariableBuilder>? typeVariables,
@@ -239,7 +242,7 @@
 /// This occurs through macros where return type or parameter types can be
 /// defined in terms of inferred types, making this type indirectly depend
 /// on type inference.
-class _InferredFunctionTypeBuilder extends FunctionTypeBuilder
+class _InferredFunctionTypeBuilder extends FunctionTypeBuilderImpl
     with InferableTypeBuilderMixin {
   _InferredFunctionTypeBuilder(
       TypeBuilder returnType,
diff --git a/pkg/front_end/lib/src/fasta/builder/inferable_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/inferable_type_builder.dart
new file mode 100644
index 0000000..48e1dda
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder/inferable_type_builder.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2023, 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:kernel/ast.dart' show DartType;
+import 'package:kernel/class_hierarchy.dart';
+
+import '../source/source_library_builder.dart';
+import 'omitted_type_builder.dart';
+import 'type_builder.dart';
+
+abstract class InferableType {
+  /// Triggers inference of this type.
+  ///
+  /// If an [Inferable] has been register, this is called to infer the type of
+  /// this builder. Otherwise the type is inferred to be `dynamic`.
+  DartType inferType(ClassHierarchyBase hierarchy);
+}
+
+class InferableTypeUse implements InferableType {
+  final SourceLibraryBuilder sourceLibraryBuilder;
+  final TypeBuilder typeBuilder;
+  final TypeUse typeUse;
+
+  InferableTypeUse(this.sourceLibraryBuilder, this.typeBuilder, this.typeUse);
+
+  @override
+  DartType inferType(ClassHierarchyBase hierarchy) {
+    return typeBuilder.build(sourceLibraryBuilder, typeUse,
+        hierarchy: hierarchy);
+  }
+}
+
+mixin InferableTypeBuilderMixin {
+  bool get hasType => _type != null;
+
+  DartType? _type;
+
+  DartType get type => _type!;
+
+  List<InferredTypeListener>? _listeners;
+
+  bool get isExplicit;
+
+  void registerInferredTypeListener(InferredTypeListener onType) {
+    if (isExplicit) return;
+    if (hasType) {
+      onType.onInferredType(type);
+    } else {
+      (_listeners ??= []).add(onType);
+    }
+  }
+
+  DartType registerType(DartType type) {
+    // TODO(johnniwinther): Avoid multiple registration from enums and
+    //  duplicated fields.
+    if (_type == null) {
+      _type = type;
+      List<InferredTypeListener>? listeners = _listeners;
+      if (listeners != null) {
+        _listeners = null;
+        for (InferredTypeListener listener in listeners) {
+          listener.onInferredType(type);
+        }
+      }
+    }
+    return _type!;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
index 6b92550..3568f2b 100644
--- a/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
@@ -4,8 +4,6 @@
 
 import 'package:front_end/src/fasta/builder/library_builder.dart';
 
-import 'package:front_end/src/fasta/builder/named_type_builder.dart';
-
 import 'package:front_end/src/fasta/builder/nullability_builder.dart';
 
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
@@ -20,14 +18,14 @@
 ///
 /// This builder results in the creation of an [InvalidType] and can only be
 /// used when an error has already been reported.
-class InvalidTypeBuilder extends TypeBuilder {
+class InvalidTypeBuilderImpl extends InvalidTypeBuilder {
   @override
   final Uri fileUri;
 
   @override
   final int charOffset;
 
-  InvalidTypeBuilder(this.fileUri, this.charOffset);
+  InvalidTypeBuilderImpl(this.fileUri, this.charOffset);
 
   @override
   DartType build(LibraryBuilder library, TypeUse typeUse,
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 1c18991..5514c0f 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -38,6 +38,7 @@
 import 'builder.dart';
 import 'builtin_type_declaration_builder.dart';
 import 'class_builder.dart';
+import 'inferable_type_builder.dart';
 import 'invalid_type_declaration_builder.dart';
 import 'library_builder.dart';
 import 'nullability_builder.dart';
@@ -92,10 +93,11 @@
   Unexpected,
 }
 
-abstract class NamedTypeBuilder extends TypeBuilder {
+abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
   @override
   final Object name;
 
+  @override
   List<TypeBuilder>? arguments;
 
   @override
@@ -115,7 +117,8 @@
 
   final bool hasExplicitTypeArguments;
 
-  factory NamedTypeBuilder(Object name, NullabilityBuilder nullabilityBuilder,
+  factory NamedTypeBuilderImpl(
+      Object name, NullabilityBuilder nullabilityBuilder,
       {List<TypeBuilder>? arguments,
       Uri? fileUri,
       int? charOffset,
@@ -144,7 +147,7 @@
             performTypeCanonicalization: performTypeCanonicalization);
   }
 
-  NamedTypeBuilder._(
+  NamedTypeBuilderImpl._(
       {required this.name,
       required this.nullabilityBuilder,
       this.arguments,
@@ -159,13 +162,13 @@
         this.hasExplicitTypeArguments = arguments != null,
         this._declaration = declaration;
 
-  factory NamedTypeBuilder.forDartType(
+  factory NamedTypeBuilderImpl.forDartType(
       DartType type,
       TypeDeclarationBuilder _declaration,
       NullabilityBuilder nullabilityBuilder,
       {List<TypeBuilder>? arguments}) = _ExplicitNamedTypeBuilder.forDartType;
 
-  factory NamedTypeBuilder.fromTypeDeclarationBuilder(
+  factory NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
       TypeDeclarationBuilder declaration, NullabilityBuilder nullabilityBuilder,
       {List<TypeBuilder>? arguments,
       Uri? fileUri,
@@ -173,7 +176,7 @@
       required InstanceTypeVariableAccessState instanceTypeVariableAccess,
       DartType? type}) = _ExplicitNamedTypeBuilder.fromTypeDeclarationBuilder;
 
-  factory NamedTypeBuilder.forInvalidType(String name,
+  factory NamedTypeBuilderImpl.forInvalidType(String name,
           NullabilityBuilder nullabilityBuilder, LocatedMessage message,
           {List<LocatedMessage>? context}) =
       _ExplicitNamedTypeBuilder.forInvalidType;
@@ -184,6 +187,7 @@
   @override
   bool get isVoidType => declaration is VoidTypeDeclarationBuilder;
 
+  @override
   void bind(LibraryBuilder libraryBuilder, TypeDeclarationBuilder declaration) {
     _declaration = declaration.origin;
     _check(libraryBuilder);
@@ -199,6 +203,7 @@
     }
   }
 
+  @override
   int get nameOffset {
     if (name is Identifier) {
       Identifier identifier = name as Identifier;
@@ -207,10 +212,12 @@
     return charOffset!;
   }
 
+  @override
   int get nameLength {
     return nameText.length;
   }
 
+  @override
   void resolveIn(
       Scope scope, int charOffset, Uri fileUri, LibraryBuilder library) {
     if (_declaration != null) return;
@@ -348,6 +355,7 @@
     return buffer;
   }
 
+  @override
   InvalidTypeDeclarationBuilder buildInvalidTypeDeclarationBuilder(
       LocatedMessage message,
       {List<LocatedMessage>? context}) {
@@ -572,7 +580,8 @@
             .clone(newTypes, contextLibrary, contextDeclaration);
       }, growable: false);
     }
-    NamedTypeBuilder newType = new NamedTypeBuilder(name, nullabilityBuilder,
+    NamedTypeBuilderImpl newType = new NamedTypeBuilderImpl(
+        name, nullabilityBuilder,
         arguments: clonedArguments,
         fileUri: fileUri,
         charOffset: charOffset,
@@ -588,7 +597,7 @@
   @override
   NamedTypeBuilder withNullabilityBuilder(
       NullabilityBuilder nullabilityBuilder) {
-    return new NamedTypeBuilder.fromTypeDeclarationBuilder(
+    return new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
         declaration!, nullabilityBuilder,
         arguments: arguments,
         fileUri: fileUri,
@@ -598,16 +607,17 @@
 
   /// Returns a copy of this named type using the provided type [arguments]
   /// instead of the original type arguments.
+  @override
   NamedTypeBuilder withArguments(List<TypeBuilder> arguments) {
     if (_declaration != null) {
-      return new NamedTypeBuilder.fromTypeDeclarationBuilder(
+      return new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
           _declaration!, nullabilityBuilder,
           arguments: arguments,
           fileUri: fileUri,
           charOffset: charOffset,
           instanceTypeVariableAccess: _instanceTypeVariableAccess);
     } else {
-      return new NamedTypeBuilder(name, nullabilityBuilder,
+      return new NamedTypeBuilderImpl(name, nullabilityBuilder,
           arguments: arguments,
           fileUri: fileUri,
           charOffset: charOffset,
@@ -620,7 +630,7 @@
 ///
 /// This is the normal function type whose type arguments are either explicit or
 /// omitted.
-class _ExplicitNamedTypeBuilder extends NamedTypeBuilder {
+class _ExplicitNamedTypeBuilder extends NamedTypeBuilderImpl {
   DartType? _type;
 
   _ExplicitNamedTypeBuilder(Object name, NullabilityBuilder nullabilityBuilder,
@@ -700,7 +710,7 @@
 ///
 /// This occurs through macros where type arguments can be defined in terms of
 /// inferred types, making this type indirectly depend on type inference.
-class _InferredNamedTypeBuilder extends NamedTypeBuilder
+class _InferredNamedTypeBuilder extends NamedTypeBuilderImpl
     with InferableTypeBuilderMixin {
   _InferredNamedTypeBuilder(Object name, NullabilityBuilder nullabilityBuilder,
       {List<TypeBuilder>? arguments,
diff --git a/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart
index 3a0a7d0..f0b6638 100644
--- a/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart
@@ -7,14 +7,14 @@
 
 import '../kernel/implicit_field_type.dart';
 import '../source/source_library_builder.dart';
+import 'inferable_type_builder.dart';
 import 'library_builder.dart';
-import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 import 'type_declaration_builder.dart';
 
-abstract class OmittedTypeBuilder extends TypeBuilder {
-  const OmittedTypeBuilder();
+abstract class OmittedTypeBuilderImpl extends OmittedTypeBuilder {
+  const OmittedTypeBuilderImpl();
 
   @override
   Supertype? buildMixedInType(LibraryBuilder library) {
@@ -55,8 +55,10 @@
     return this;
   }
 
+  @override
   bool get hasType;
 
+  @override
   DartType get type;
 }
 
@@ -67,7 +69,7 @@
 /// field types and initializing formal types, use [InferableTypeBuilder]
 /// instead. This should be created through
 /// [SourceLibraryBuilder.addInferableType] to ensure the type is inferred.
-class ImplicitTypeBuilder extends OmittedTypeBuilder {
+class ImplicitTypeBuilder extends OmittedTypeBuilderImpl {
   const ImplicitTypeBuilder();
 
   @override
@@ -102,7 +104,7 @@
 ///
 /// [InferableTypeBuilder] should be created through
 /// [SourceLibraryBuilder.addInferableType] to ensure the type is inferred.
-class InferableTypeBuilder extends OmittedTypeBuilder
+class InferableTypeBuilder extends OmittedTypeBuilderImpl
     with InferableTypeBuilderMixin
     implements InferableType {
   @override
@@ -184,7 +186,7 @@
 ///
 /// This is used in macro generated code to create type annotations from
 /// inferred types in the original code.
-class DependentTypeBuilder extends OmittedTypeBuilder
+class DependentTypeBuilder extends OmittedTypeBuilderImpl
     with InferableTypeBuilderMixin
     implements InferredTypeListener {
   final OmittedTypeBuilder typeBuilder;
diff --git a/pkg/front_end/lib/src/fasta/builder/record_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/record_type_builder.dart
index 10d7d4c..3179835 100644
--- a/pkg/front_end/lib/src/fasta/builder/record_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/record_type_builder.dart
@@ -19,14 +19,16 @@
 import '../kernel/implicit_field_type.dart';
 import '../source/source_library_builder.dart';
 import '../util/helpers.dart';
+import 'inferable_type_builder.dart';
 import 'library_builder.dart';
 import 'metadata_builder.dart';
-import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
-abstract class RecordTypeBuilder extends TypeBuilder {
+abstract class RecordTypeBuilderImpl extends RecordTypeBuilder {
+  @override
   final List<RecordTypeFieldBuilder>? positionalFields;
+  @override
   final List<RecordTypeFieldBuilder>? namedFields;
   @override
   final NullabilityBuilder nullabilityBuilder;
@@ -35,7 +37,7 @@
   @override
   final int charOffset;
 
-  factory RecordTypeBuilder(
+  factory RecordTypeBuilderImpl(
       List<RecordTypeFieldBuilder>? positional,
       List<RecordTypeFieldBuilder>? named,
       NullabilityBuilder nullabilityBuilder,
@@ -65,7 +67,7 @@
             positional, named, nullabilityBuilder, fileUri, charOffset);
   }
 
-  RecordTypeBuilder._(this.positionalFields, this.namedFields,
+  RecordTypeBuilderImpl._(this.positionalFields, this.namedFields,
       this.nullabilityBuilder, this.fileUri, this.charOffset);
 
   @override
@@ -292,14 +294,14 @@
         return entry.clone(newTypes, contextLibrary, contextDeclaration);
       }, growable: false);
     }
-    return new RecordTypeBuilder(
+    return new RecordTypeBuilderImpl(
         clonedPositional, clonedNamed, nullabilityBuilder, fileUri, charOffset);
   }
 
   @override
   RecordTypeBuilder withNullabilityBuilder(
       NullabilityBuilder nullabilityBuilder) {
-    return new RecordTypeBuilder(
+    return new RecordTypeBuilderImpl(
         positionalFields, namedFields, nullabilityBuilder, fileUri, charOffset);
   }
 }
@@ -308,7 +310,7 @@
 ///
 /// This is the normal record type whose field types are either explicit or
 /// omitted.
-class _ExplicitRecordTypeBuilder extends RecordTypeBuilder {
+class _ExplicitRecordTypeBuilder extends RecordTypeBuilderImpl {
   _ExplicitRecordTypeBuilder(
       List<RecordTypeFieldBuilder>? positionalFields,
       List<RecordTypeFieldBuilder>? namedFields,
@@ -334,7 +336,7 @@
 ///
 /// This occurs through macros where field types can be defined in terms of
 /// inferred types, making this type indirectly depend on type inference.
-class _InferredRecordTypeBuilder extends RecordTypeBuilder
+class _InferredRecordTypeBuilder extends RecordTypeBuilderImpl
     with InferableTypeBuilderMixin {
   _InferredRecordTypeBuilder(
       List<RecordTypeFieldBuilder>? positionalFields,
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index b6070ef..2fa1d10 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -373,7 +373,7 @@
           List<TypeBuilder> freshTypeArguments = [
             if (typeVariables != null)
               for (TypeVariableBuilder typeVariable in typeVariables!)
-                new NamedTypeBuilder.fromTypeDeclarationBuilder(
+                new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
                     typeVariable, libraryBuilder.nonNullableBuilder,
                     arguments: const [],
                     fileUri: fileUri,
diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
index 0323687..9b89136 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -8,11 +8,15 @@
 import 'package:kernel/class_hierarchy.dart';
 
 import '../kernel/type_algorithms.dart';
+import '../messages.dart';
+import '../scope.dart';
 import '../source/source_library_builder.dart';
+import 'formal_parameter_builder.dart';
+import 'invalid_type_declaration_builder.dart';
 import 'library_builder.dart';
-import 'named_type_builder.dart';
 import 'nullability_builder.dart';
 import 'omitted_type_builder.dart';
+import 'record_type_builder.dart';
 import 'type_alias_builder.dart';
 import 'type_declaration_builder.dart';
 import 'type_variable_builder.dart';
@@ -275,7 +279,7 @@
   macroTypeArgument,
 }
 
-abstract class TypeBuilder {
+sealed class TypeBuilder {
   const TypeBuilder();
 
   TypeDeclarationBuilder? get declaration => null;
@@ -429,60 +433,51 @@
       this;
 }
 
-abstract class InferableType {
-  /// Triggers inference of this type.
-  ///
-  /// If an [Inferable] has been register, this is called to infer the type of
-  /// this builder. Otherwise the type is inferred to be `dynamic`.
-  DartType inferType(ClassHierarchyBase hierarchy);
+abstract class OmittedTypeBuilder extends TypeBuilder {
+  const OmittedTypeBuilder();
+
+  bool get hasType;
+
+  DartType get type;
 }
 
-class InferableTypeUse implements InferableType {
-  final SourceLibraryBuilder sourceLibraryBuilder;
-  final TypeBuilder typeBuilder;
-  final TypeUse typeUse;
-
-  InferableTypeUse(this.sourceLibraryBuilder, this.typeBuilder, this.typeUse);
-
+abstract class FunctionTypeBuilder extends TypeBuilder {
   @override
-  DartType inferType(ClassHierarchyBase hierarchy) {
-    return typeBuilder.build(sourceLibraryBuilder, typeUse,
-        hierarchy: hierarchy);
-  }
+  int get charOffset;
+  TypeBuilder get returnType;
+  List<ParameterBuilder>? get formals;
+  List<TypeVariableBuilder>? get typeVariables;
 }
 
-mixin InferableTypeBuilderMixin implements TypeBuilder {
-  bool get hasType => _type != null;
+abstract class InvalidTypeBuilder extends TypeBuilder {}
 
-  DartType? _type;
-
-  DartType get type => _type!;
-
-  List<InferredTypeListener>? _listeners;
-
+abstract class NamedTypeBuilder extends TypeBuilder {
   @override
-  void registerInferredTypeListener(InferredTypeListener onType) {
-    if (isExplicit) return;
-    if (hasType) {
-      onType.onInferredType(type);
-    } else {
-      (_listeners ??= []).add(onType);
-    }
-  }
+  Object get name;
 
-  DartType registerType(DartType type) {
-    // TODO(johnniwinther): Avoid multiple registration from enums and
-    //  duplicated fields.
-    if (_type == null) {
-      _type = type;
-      List<InferredTypeListener>? listeners = _listeners;
-      if (listeners != null) {
-        _listeners = null;
-        for (InferredTypeListener listener in listeners) {
-          listener.onInferredType(type);
-        }
-      }
-    }
-    return _type!;
-  }
+  int get nameOffset;
+
+  int get nameLength;
+
+  void resolveIn(
+      Scope scope, int charOffset, Uri fileUri, LibraryBuilder library);
+  void bind(LibraryBuilder libraryBuilder, TypeDeclarationBuilder declaration);
+  List<TypeBuilder>? get arguments;
+  NamedTypeBuilder withArguments(List<TypeBuilder> arguments);
+  InvalidTypeDeclarationBuilder buildInvalidTypeDeclarationBuilder(
+      LocatedMessage message,
+      {List<LocatedMessage>? context});
+}
+
+abstract class RecordTypeBuilder extends TypeBuilder {
+  List<RecordTypeFieldBuilder>? get positionalFields;
+  List<RecordTypeFieldBuilder>? get namedFields;
+  @override
+  int get charOffset;
+  @override
+  Uri get fileUri;
+}
+
+abstract class FixedTypeBuilder extends TypeBuilder {
+  const FixedTypeBuilder();
 }
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 0d4f649..f528799 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
@@ -19,10 +19,12 @@
 import '../util/helpers.dart';
 import 'builder.dart';
 import 'class_builder.dart';
+import 'formal_parameter_builder.dart';
 import 'library_builder.dart';
 import 'metadata_builder.dart';
-import 'named_type_builder.dart';
 import 'nullability_builder.dart';
+import 'record_type_builder.dart';
+import 'type_alias_builder.dart';
 import 'type_builder.dart';
 import 'type_declaration_builder.dart';
 
@@ -191,8 +193,8 @@
     return new TypeParameterType(parameter, nullability);
   }
 
-  void finish(
-      LibraryBuilder library, ClassBuilder object, TypeBuilder dynamicType) {
+  void finish(SourceLibraryBuilder library, ClassBuilder object,
+      TypeBuilder dynamicType) {
     if (isPatch) return;
     DartType objectType = object.buildAliasedType(
         library,
@@ -265,3 +267,90 @@
         growable: true);
   }
 }
+
+List<TypeVariableBuilder> sortTypeVariablesTopologically(
+    Iterable<TypeVariableBuilder> typeVariables) {
+  Set<TypeVariableBuilder> unhandled = new Set<TypeVariableBuilder>.identity()
+    ..addAll(typeVariables);
+  List<TypeVariableBuilder> result = <TypeVariableBuilder>[];
+  while (unhandled.isNotEmpty) {
+    TypeVariableBuilder rootVariable = unhandled.first;
+    unhandled.remove(rootVariable);
+    if (rootVariable.bound != null) {
+      _sortTypeVariablesTopologicallyFromRoot(
+          rootVariable.bound!, unhandled, result);
+    }
+    result.add(rootVariable);
+  }
+  return result;
+}
+
+void _sortTypeVariablesTopologicallyFromRoot(TypeBuilder root,
+    Set<TypeVariableBuilder> unhandled, List<TypeVariableBuilder> result) {
+  List<TypeVariableBuilder>? foundTypeVariables;
+  List<TypeBuilder>? internalDependents;
+
+  switch (root) {
+    case NamedTypeBuilder(:TypeDeclarationBuilder? declaration):
+      if (declaration is ClassBuilder) {
+        foundTypeVariables = declaration.typeVariables;
+      } else if (declaration is TypeAliasBuilder) {
+        foundTypeVariables = declaration.typeVariables;
+        internalDependents = <TypeBuilder>[declaration.type];
+      } else if (declaration is TypeVariableBuilder) {
+        foundTypeVariables = <TypeVariableBuilder>[declaration];
+      }
+    case FunctionTypeBuilder(
+        :List<TypeVariableBuilder>? typeVariables,
+        :List<ParameterBuilder>? formals,
+        :TypeBuilder returnType
+      ):
+      foundTypeVariables = typeVariables;
+      if (formals != null) {
+        internalDependents = <TypeBuilder>[];
+        for (ParameterBuilder formal in formals) {
+          internalDependents.add(formal.type);
+        }
+      }
+      if (returnType is! OmittedTypeBuilder) {
+        (internalDependents ??= <TypeBuilder>[]).add(returnType);
+      }
+    case RecordTypeBuilder(
+        :List<RecordTypeFieldBuilder>? positionalFields,
+        :List<RecordTypeFieldBuilder>? namedFields
+      ):
+      if (positionalFields != null) {
+        internalDependents = <TypeBuilder>[];
+        for (RecordTypeFieldBuilder field in positionalFields) {
+          internalDependents.add(field.type);
+        }
+      }
+      if (namedFields != null) {
+        internalDependents ??= <TypeBuilder>[];
+        for (RecordTypeFieldBuilder field in namedFields) {
+          internalDependents.add(field.type);
+        }
+      }
+    case OmittedTypeBuilder():
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+  }
+
+  if (foundTypeVariables != null && foundTypeVariables.isNotEmpty) {
+    for (TypeVariableBuilder variable in foundTypeVariables) {
+      if (unhandled.contains(variable)) {
+        unhandled.remove(variable);
+        if (variable.bound != null) {
+          _sortTypeVariablesTopologicallyFromRoot(
+              variable.bound!, unhandled, result);
+        }
+        result.add(variable);
+      }
+    }
+  }
+  if (internalDependents != null && internalDependents.isNotEmpty) {
+    for (TypeBuilder type in internalDependents) {
+      _sortTypeVariablesTopologicallyFromRoot(type, unhandled, result);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 229affd..15c5014 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -96,9 +96,7 @@
 
 import 'builder/name_iterator.dart' show NameIterator;
 
-import 'builder/named_type_builder.dart' show NamedTypeBuilder;
-
-import 'builder/type_builder.dart' show TypeBuilder;
+import 'builder/type_builder.dart' show NamedTypeBuilder, TypeBuilder;
 
 import 'builder/type_declaration_builder.dart' show TypeDeclarationBuilder;
 
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 3d4dda5..6668fa4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4953,7 +4953,7 @@
         Message message = fasta.templateNotAType.withArguments(displayName);
         libraryBuilder.addProblem(
             message, offset, lengthOfSpan(beginToken, suffix), uri);
-        push(new NamedTypeBuilder.forInvalidType(
+        push(new NamedTypeBuilderImpl.forInvalidType(
             name,
             libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable),
             message.withLocation(
@@ -4981,7 +4981,7 @@
       // TODO(ahe): Arguments could be passed here.
       libraryBuilder.addProblem(
           name.message, name.charOffset, name.name.length, name.fileUri);
-      result = new NamedTypeBuilder.forInvalidType(
+      result = new NamedTypeBuilderImpl.forInvalidType(
           name.name,
           libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable),
           name.message
@@ -5049,7 +5049,7 @@
         const FixedNullableList<RecordTypeFieldBuilder>().popNonNullable(stack,
             hasNamedFields ? count - 1 : count, dummyRecordTypeFieldBuilder);
 
-    push(new RecordTypeBuilder(
+    push(new RecordTypeBuilderImpl(
       positionalFields,
       namedFields,
       questionMark != null
@@ -5082,7 +5082,7 @@
     push(new RecordTypeFieldBuilder(
         [],
         type is ParserRecovery
-            ? new InvalidTypeBuilder(uri, type.charOffset)
+            ? new InvalidTypeBuilderImpl(uri, type.charOffset)
             : type as TypeBuilder,
         name is Identifier ? name.name : null,
         name is Identifier ? name.charOffset : TreeNode.noOffset));
@@ -5136,7 +5136,7 @@
     debugEvent("VoidKeyword");
     int offset = offsetForToken(token);
     // "void" is always nullable.
-    push(new NamedTypeBuilder.fromTypeDeclarationBuilder(
+    push(new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
         new VoidTypeDeclarationBuilder(
             const VoidType(), libraryBuilder, offset),
         const NullabilityBuilder.inherent(),
@@ -8998,42 +8998,80 @@
 
   void _validateTypeVariableUseInternal(TypeBuilder? builder,
       {required bool allowPotentiallyConstantType}) {
-    if (builder is NamedTypeBuilder) {
-      if (builder.declaration!.isTypeVariable) {
-        TypeVariableBuilder typeParameterBuilder =
-            builder.declaration as TypeVariableBuilder;
-        TypeParameter typeParameter = typeParameterBuilder.parameter;
-        if (typeParameter.parent is Class ||
-            typeParameter.parent is Extension) {
-          if (constantContext != ConstantContext.none &&
-              (!inConstructorInitializer || !allowPotentiallyConstantType)) {
-            LocatedMessage message = fasta.messageTypeVariableInConstantContext
-                .withLocation(builder.fileUri!, builder.charOffset!,
-                    typeParameter.name!.length);
-            builder.bind(
-                libraryBuilder,
-                new InvalidTypeDeclarationBuilder(
-                    typeParameter.name!, message));
-            addProblem(
-                message.messageObject, message.charOffset, message.length);
+    switch (builder) {
+      case NamedTypeBuilder(
+          :TypeDeclarationBuilder? declaration,
+          :List<TypeBuilder>? arguments
+        ):
+        if (declaration!.isTypeVariable) {
+          TypeVariableBuilder typeParameterBuilder =
+              declaration as TypeVariableBuilder;
+          TypeParameter typeParameter = typeParameterBuilder.parameter;
+          if (typeParameter.parent is Class ||
+              typeParameter.parent is Extension) {
+            if (constantContext != ConstantContext.none &&
+                (!inConstructorInitializer || !allowPotentiallyConstantType)) {
+              LocatedMessage message =
+                  fasta.messageTypeVariableInConstantContext.withLocation(
+                      builder.fileUri!,
+                      builder.charOffset!,
+                      typeParameter.name!.length);
+              builder.bind(
+                  libraryBuilder,
+                  new InvalidTypeDeclarationBuilder(
+                      typeParameter.name!, message));
+              addProblem(
+                  message.messageObject, message.charOffset, message.length);
+            }
           }
         }
-      }
-      if (builder.arguments != null) {
-        for (TypeBuilder typeBuilder in builder.arguments!) {
-          _validateTypeVariableUseInternal(typeBuilder,
-              allowPotentiallyConstantType: allowPotentiallyConstantType);
+        if (arguments != null) {
+          for (TypeBuilder typeBuilder in arguments) {
+            _validateTypeVariableUseInternal(typeBuilder,
+                allowPotentiallyConstantType: allowPotentiallyConstantType);
+          }
         }
-      }
-    } else if (builder is FunctionTypeBuilder) {
-      _validateTypeVariableUseInternal(builder.returnType,
-          allowPotentiallyConstantType: allowPotentiallyConstantType);
-      if (builder.formals != null) {
-        for (ParameterBuilder formalParameterBuilder in builder.formals!) {
-          _validateTypeVariableUseInternal(formalParameterBuilder.type,
-              allowPotentiallyConstantType: allowPotentiallyConstantType);
+      case FunctionTypeBuilder(
+          :List<TypeVariableBuilder>? typeVariables,
+          :List<ParameterBuilder>? formals,
+          :TypeBuilder returnType
+        ):
+        if (typeVariables != null) {
+          for (TypeVariableBuilder typeVariable in typeVariables) {
+            _validateTypeVariableUseInternal(typeVariable.bound,
+                allowPotentiallyConstantType: allowPotentiallyConstantType);
+            _validateTypeVariableUseInternal(typeVariable.defaultType,
+                allowPotentiallyConstantType: allowPotentiallyConstantType);
+          }
         }
-      }
+        _validateTypeVariableUseInternal(returnType,
+            allowPotentiallyConstantType: allowPotentiallyConstantType);
+        if (formals != null) {
+          for (ParameterBuilder formalParameterBuilder in formals) {
+            _validateTypeVariableUseInternal(formalParameterBuilder.type,
+                allowPotentiallyConstantType: allowPotentiallyConstantType);
+          }
+        }
+      case RecordTypeBuilder(
+          :List<RecordTypeFieldBuilder>? positionalFields,
+          :List<RecordTypeFieldBuilder>? namedFields
+        ):
+        if (positionalFields != null) {
+          for (RecordTypeFieldBuilder field in positionalFields) {
+            _validateTypeVariableUseInternal(field.type,
+                allowPotentiallyConstantType: allowPotentiallyConstantType);
+          }
+        }
+        if (namedFields != null) {
+          for (RecordTypeFieldBuilder field in namedFields) {
+            _validateTypeVariableUseInternal(field.type,
+                allowPotentiallyConstantType: allowPotentiallyConstantType);
+          }
+        }
+      case OmittedTypeBuilder():
+      case FixedTypeBuilder():
+      case InvalidTypeBuilder():
+      case null:
     }
   }
 
@@ -9830,7 +9868,7 @@
   TypeBuilder toFunctionType(
       TypeBuilder returnType, NullabilityBuilder nullabilityBuilder,
       [List<TypeVariableBuilder>? typeParameters]) {
-    return new FunctionTypeBuilder(returnType, typeParameters, parameters,
+    return new FunctionTypeBuilderImpl(returnType, typeParameters, parameters,
         nullabilityBuilder, uri, charOffset);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart
index b22f095..19a9918 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart
@@ -13,7 +13,6 @@
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
-import '../builder/omitted_type_builder.dart';
 import '../builder/type_builder.dart';
 import '../constant_context.dart' show ConstantContext;
 import '../dill/dill_class_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index a715e8e..5323341 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -6263,7 +6263,9 @@
   bool visitFunctionType(FunctionType node) {
     final List<TypeParameter> parameters = node.typeParameters;
     _availableVariables.addAll(parameters);
-    final bool result = node.returnType.accept(this) &&
+    final bool result = node.typeParameters
+            .every((p) => p.bound.accept(this) && p.defaultType.accept(this)) &&
+        node.returnType.accept(this) &&
         node.positionalParameters.every((p) => p.accept(this)) &&
         node.namedParameters.every((p) => p.type.accept(this));
     _availableVariables.removeAll(parameters);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 10b819c..b86d38f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -260,7 +260,9 @@
     Message message = templateNotAType.withArguments(token.lexeme);
     _helper.libraryBuilder
         .addProblem(message, fileOffset, lengthForToken(token), _uri);
-    return new NamedTypeBuilder.forInvalidType(token.lexeme, nullabilityBuilder,
+    return new NamedTypeBuilderImpl.forInvalidType(
+        token.lexeme,
+        nullabilityBuilder,
         message.withLocation(_uri, fileOffset, lengthForToken(token)));
   }
 
@@ -2966,7 +2968,7 @@
     }
     _helper.libraryBuilder.addProblem(
         message.messageObject, message.charOffset, message.length, message.uri);
-    return new NamedTypeBuilder.forInvalidType(
+    return new NamedTypeBuilderImpl.forInvalidType(
         name, nullabilityBuilder, message);
   }
 
@@ -3073,7 +3075,7 @@
       return new DependentTypeBuilder(
           (declaration as OmittedTypeDeclarationBuilder).omittedTypeBuilder);
     }
-    return new NamedTypeBuilder(targetName, nullabilityBuilder,
+    return new NamedTypeBuilderImpl(targetName, nullabilityBuilder,
         arguments: arguments,
         fileUri: _uri,
         charOffset: fileOffset,
@@ -3172,7 +3174,7 @@
       } else {
         if (declarationBuilder is DeclarationBuilder) {
           if (aliasedTypeArguments != null) {
-            new NamedTypeBuilder(
+            new NamedTypeBuilderImpl(
                 aliasBuilder.name, const NullabilityBuilder.omitted(),
                 arguments: aliasedTypeArguments,
                 fileUri: _uri,
@@ -3192,7 +3194,7 @@
             aliasedTypeArguments = <TypeBuilder>[];
             for (TypeVariableBuilder typeVariable
                 in aliasBuilder.typeVariables!) {
-              aliasedTypeArguments.add(new NamedTypeBuilder(
+              aliasedTypeArguments.add(new NamedTypeBuilderImpl(
                   typeVariable.name, const NullabilityBuilder.omitted(),
                   fileUri: _uri,
                   charOffset: fileOffset,
@@ -4211,7 +4213,7 @@
         offsetForToken(prefixGenerator.token),
         lengthOfSpan(prefixGenerator.token, token),
         _uri);
-    return new NamedTypeBuilder.forInvalidType(
+    return new NamedTypeBuilderImpl.forInvalidType(
         _plainNameForRead,
         nullabilityBuilder,
         message.withLocation(_uri, offsetForToken(prefixGenerator.token),
@@ -4319,14 +4321,14 @@
       {required bool allowPotentiallyConstantType,
       required bool performTypeCanonicalization}) {
     _helper.libraryBuilder.addProblem(message, fileOffset, noLength, _uri);
-    return new NamedTypeBuilder.forInvalidType(token.lexeme, nullabilityBuilder,
-        message.withLocation(_uri, fileOffset, noLength));
+    return new NamedTypeBuilderImpl.forInvalidType(token.lexeme,
+        nullabilityBuilder, message.withLocation(_uri, fileOffset, noLength));
   }
 
   TypeBuilder buildTypeWithResolvedArgumentsDoNotAddProblem(
       NullabilityBuilder nullabilityBuilder) {
-    return new NamedTypeBuilder.forInvalidType(token.lexeme, nullabilityBuilder,
-        message.withLocation(_uri, fileOffset, noLength));
+    return new NamedTypeBuilderImpl.forInvalidType(token.lexeme,
+        nullabilityBuilder, message.withLocation(_uri, fileOffset, noLength));
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
index 73b6d8b..c3c0d4c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
@@ -296,8 +296,8 @@
         typeArguments.length,
         (int i) => _hierarchy.loader.computeTypeBuilder(typeArguments[i]),
         growable: false);
-    NamedTypeBuilder mixedInTypeBuilder =
-        _classBuilder.mixedInTypeBuilder as NamedTypeBuilder;
+    NamedTypeBuilderImpl mixedInTypeBuilder =
+        _classBuilder.mixedInTypeBuilder as NamedTypeBuilderImpl;
     mixedInTypeBuilder.arguments = inferredArguments;
     return mixinNode;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
index 7e173bb..c8bba62 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
@@ -15,7 +15,6 @@
 import '../../builder/formal_parameter_builder.dart';
 import '../../builder/library_builder.dart';
 import '../../builder/member_builder.dart';
-import '../../builder/named_type_builder.dart';
 import '../../builder/omitted_type_builder.dart';
 import '../../builder/type_alias_builder.dart';
 import '../../builder/type_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index a257ab6..e835bb4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -11,7 +11,7 @@
 import 'package:kernel/src/assumptions.dart';
 import 'package:kernel/src/printer.dart';
 
-import '../builder/type_builder.dart';
+import '../builder/inferable_type_builder.dart';
 import '../constant_context.dart';
 import '../fasta_codes.dart';
 import '../problems.dart' show unsupported;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index f8a634f..19f4c19 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -106,31 +106,31 @@
 
   // 'dynamic' is always nullable.
   // TODO(johnniwinther): Why isn't this using a FixedTypeBuilder?
-  final NamedTypeBuilder dynamicType = new NamedTypeBuilder(
+  final NamedTypeBuilder dynamicType = new NamedTypeBuilderImpl(
       "dynamic", const NullabilityBuilder.inherent(),
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
-  final NamedTypeBuilder objectType = new NamedTypeBuilder(
+  final NamedTypeBuilder objectType = new NamedTypeBuilderImpl(
       "Object", const NullabilityBuilder.omitted(),
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
   // Null is always nullable.
   // TODO(johnniwinther): This could (maybe) use a FixedTypeBuilder when we
   //  have NullType?
-  final NamedTypeBuilder nullType = new NamedTypeBuilder(
+  final NamedTypeBuilder nullType = new NamedTypeBuilderImpl(
       "Null", const NullabilityBuilder.inherent(),
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
   // TODO(johnniwinther): Why isn't this using a FixedTypeBuilder?
-  final NamedTypeBuilder bottomType = new NamedTypeBuilder(
+  final NamedTypeBuilder bottomType = new NamedTypeBuilderImpl(
       "Never", const NullabilityBuilder.omitted(),
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
-  final NamedTypeBuilder enumType = new NamedTypeBuilder(
+  final NamedTypeBuilder enumType = new NamedTypeBuilderImpl(
       "Enum", const NullabilityBuilder.omitted(),
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
-  final NamedTypeBuilder underscoreEnumType = new NamedTypeBuilder(
+  final NamedTypeBuilder underscoreEnumType = new NamedTypeBuilderImpl(
       "_Enum", const NullabilityBuilder.omitted(),
       instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
index 982e4a6..e6b667d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
@@ -23,9 +23,7 @@
 import '../../builder/formal_parameter_builder.dart';
 import '../../builder/library_builder.dart';
 import '../../builder/member_builder.dart';
-import '../../builder/named_type_builder.dart';
 import '../../builder/nullability_builder.dart';
-import '../../builder/omitted_type_builder.dart';
 import '../../builder/type_alias_builder.dart';
 import '../../builder/type_builder.dart';
 import '../../builder/type_declaration_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index fc6b94e..7424604c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -18,7 +18,6 @@
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/nullability_builder.dart';
-import '../builder/omitted_type_builder.dart';
 import '../builder/record_type_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
@@ -58,26 +57,28 @@
 // type variable.
 int computeTypeVariableBuilderVariance(TypeVariableBuilder variable,
     TypeBuilder? type, LibraryBuilder libraryBuilder) {
-  if (type is NamedTypeBuilder) {
-    assert(type.declaration != null);
-    TypeDeclarationBuilder? declaration = type.declaration;
-    if (declaration is TypeVariableBuilder) {
-      if (declaration == variable) {
-        return Variance.covariant;
-      } else {
-        return Variance.unrelated;
-      }
-    } else {
-      if (declaration is ClassBuilder) {
+  switch (type) {
+    case NamedTypeBuilder(
+        :TypeDeclarationBuilder? declaration,
+        :List<TypeBuilder>? arguments
+      ):
+      assert(declaration != null);
+      if (declaration is TypeVariableBuilder) {
+        if (declaration == variable) {
+          return Variance.covariant;
+        } else {
+          return Variance.unrelated;
+        }
+      } else if (declaration is ClassBuilder) {
         int result = Variance.unrelated;
-        if (type.arguments != null) {
-          for (int i = 0; i < type.arguments!.length; ++i) {
+        if (arguments != null) {
+          for (int i = 0; i < arguments.length; ++i) {
             result = Variance.meet(
                 result,
                 Variance.combine(
                     declaration.cls.typeParameters[i].variance,
                     computeTypeVariableBuilderVariance(
-                        variable, type.arguments![i], libraryBuilder)));
+                        variable, arguments[i], libraryBuilder)));
           }
         }
         return result;
@@ -124,42 +125,72 @@
         }
         return result;
       }
-    }
-  } else if (type is FunctionTypeBuilder) {
-    int result = Variance.unrelated;
-    if (type.returnType is! OmittedTypeBuilder) {
-      result = Variance.meet(
-          result,
-          computeTypeVariableBuilderVariance(
-              variable, type.returnType, libraryBuilder));
-    }
-    if (type.typeVariables != null) {
-      for (TypeVariableBuilder typeVariable in type.typeVariables!) {
-        // If [variable] is referenced in the bound at all, it makes the
-        // variance of [variable] in the entire type invariant.  The invocation
-        // of [computeVariance] below is made to simply figure out if [variable]
-        // occurs in the bound.
-        if (typeVariable.bound != null &&
-            computeTypeVariableBuilderVariance(
-                    variable, typeVariable.bound!, libraryBuilder) !=
-                Variance.unrelated) {
-          result = Variance.invariant;
-        }
-      }
-    }
-    if (type.formals != null) {
-      for (ParameterBuilder formal in type.formals!) {
+      return Variance.unrelated;
+    case FunctionTypeBuilder(
+        :List<TypeVariableBuilder>? typeVariables,
+        :List<ParameterBuilder>? formals,
+        :TypeBuilder returnType
+      ):
+      int result = Variance.unrelated;
+      if (returnType is! OmittedTypeBuilder) {
         result = Variance.meet(
             result,
-            Variance.combine(
-                Variance.contravariant,
-                computeTypeVariableBuilderVariance(
-                    variable, formal.type, libraryBuilder)));
+            computeTypeVariableBuilderVariance(
+                variable, returnType, libraryBuilder));
       }
-    }
-    return result;
+      if (typeVariables != null) {
+        for (TypeVariableBuilder typeVariable in typeVariables) {
+          // If [variable] is referenced in the bound at all, it makes the
+          // variance of [variable] in the entire type invariant.  The
+          // invocation of [computeVariance] below is made to simply figure out
+          // if [variable] occurs in the bound.
+          if (typeVariable.bound != null &&
+              computeTypeVariableBuilderVariance(
+                      variable, typeVariable.bound!, libraryBuilder) !=
+                  Variance.unrelated) {
+            result = Variance.invariant;
+          }
+        }
+      }
+      if (formals != null) {
+        for (ParameterBuilder formal in formals) {
+          result = Variance.meet(
+              result,
+              Variance.combine(
+                  Variance.contravariant,
+                  computeTypeVariableBuilderVariance(
+                      variable, formal.type, libraryBuilder)));
+        }
+      }
+      return result;
+    case RecordTypeBuilder(
+        :List<RecordTypeFieldBuilder>? positionalFields,
+        :List<RecordTypeFieldBuilder>? namedFields
+      ):
+      int result = Variance.unrelated;
+      if (positionalFields != null) {
+        for (RecordTypeFieldBuilder field in positionalFields) {
+          result = Variance.meet(
+              result,
+              computeTypeVariableBuilderVariance(
+                  variable, field.type, libraryBuilder));
+        }
+      }
+      if (namedFields != null) {
+        for (RecordTypeFieldBuilder field in namedFields) {
+          result = Variance.meet(
+              result,
+              computeTypeVariableBuilderVariance(
+                  variable, field.type, libraryBuilder));
+        }
+      }
+      return result;
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+    case OmittedTypeBuilder():
+    case null:
+      return Variance.unrelated;
   }
-  return Variance.unrelated;
 }
 
 /// Combines syntactic nullabilities on types for performing type substitution.
@@ -187,18 +218,42 @@
     List<TypeBuilder> unboundTypes,
     List<TypeVariableBuilder> unboundTypeVariables,
     {final int variance = Variance.covariant}) {
-  if (type is NamedTypeBuilder) {
-    if (type.declaration is TypeVariableBuilder) {
-      if (variance == Variance.contravariant) {
-        TypeBuilder? replacement = lowerSubstitution[type.declaration];
-        if (replacement != null) {
-          return replacement.withNullabilityBuilder(
-              combineNullabilityBuildersForSubstitution(
-                  replacement.nullabilityBuilder, type.nullabilityBuilder));
-        }
-        return type;
-      }
-      TypeBuilder? replacement = upperSubstitution[type.declaration];
+  switch (type) {
+    case NamedTypeBuilder():
+      return _substituteNamedTypeBuilder(type, upperSubstitution,
+          lowerSubstitution, unboundTypes, unboundTypeVariables,
+          variance: variance);
+
+    case FunctionTypeBuilder():
+      return _substituteFunctionTypeBuilder(type, upperSubstitution,
+          lowerSubstitution, unboundTypes, unboundTypeVariables,
+          variance: variance);
+
+    case RecordTypeBuilder():
+      return _substituteRecordTypeBuilder(type, upperSubstitution,
+          lowerSubstitution, unboundTypes, unboundTypeVariables,
+          variance: variance);
+
+    case OmittedTypeBuilder():
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+      return type;
+  }
+}
+
+TypeBuilder _substituteNamedTypeBuilder(
+    NamedTypeBuilder type,
+    Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
+    Map<TypeVariableBuilder, TypeBuilder> lowerSubstitution,
+    List<TypeBuilder> unboundTypes,
+    List<TypeVariableBuilder> unboundTypeVariables,
+    {final int variance = Variance.covariant}) {
+  TypeDeclarationBuilder? declaration = type.declaration;
+  List<TypeBuilder>? arguments = type.arguments;
+
+  if (declaration is TypeVariableBuilder) {
+    if (variance == Variance.contravariant) {
+      TypeBuilder? replacement = lowerSubstitution[declaration];
       if (replacement != null) {
         return replacement.withNullabilityBuilder(
             combineNullabilityBuildersForSubstitution(
@@ -206,221 +261,245 @@
       }
       return type;
     }
-    if (type.arguments == null || type.arguments!.length == 0) {
-      return type;
+    TypeBuilder? replacement = upperSubstitution[declaration];
+    if (replacement != null) {
+      return replacement.withNullabilityBuilder(
+          combineNullabilityBuildersForSubstitution(
+              replacement.nullabilityBuilder, type.nullabilityBuilder));
     }
-    List<TypeBuilder>? arguments;
-    TypeDeclarationBuilder? declaration = type.declaration;
+    return type;
+  }
+  if (arguments == null || arguments.length == 0) {
+    return type;
+  }
+  List<TypeBuilder>? newArguments;
+  if (declaration == null) {
+    assert(
+        identical(upperSubstitution, lowerSubstitution),
+        "Can only handle unbound named type builders identical "
+        "`upperSubstitution` and `lowerSubstitution`.");
+    for (int i = 0; i < arguments.length; ++i) {
+      TypeBuilder substitutedArgument = substituteRange(
+          arguments[i],
+          upperSubstitution,
+          lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: variance);
+      if (substitutedArgument != arguments[i]) {
+        newArguments ??= arguments.toList();
+        newArguments[i] = substitutedArgument;
+      }
+    }
+  } else if (declaration is ClassBuilder) {
+    for (int i = 0; i < arguments.length; ++i) {
+      TypeBuilder substitutedArgument = substituteRange(
+          arguments[i],
+          upperSubstitution,
+          lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: variance);
+      if (substitutedArgument != arguments[i]) {
+        newArguments ??= arguments.toList();
+        newArguments[i] = substitutedArgument;
+      }
+    }
+  } else if (declaration is ExtensionTypeDeclarationBuilder) {
+    for (int i = 0; i < arguments.length; ++i) {
+      TypeBuilder substitutedArgument = substituteRange(
+          arguments[i],
+          upperSubstitution,
+          lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: variance);
+      if (substitutedArgument != arguments[i]) {
+        newArguments ??= arguments.toList();
+        newArguments[i] = substitutedArgument;
+      }
+    }
+  } else if (declaration is TypeAliasBuilder) {
+    for (int i = 0; i < arguments.length; ++i) {
+      TypeVariableBuilder variable = declaration.typeVariables![i];
+      TypeBuilder substitutedArgument = substituteRange(
+          arguments[i],
+          upperSubstitution,
+          lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: Variance.combine(variance, variable.variance));
+      if (substitutedArgument != arguments[i]) {
+        newArguments ??= arguments.toList();
+        newArguments[i] = substitutedArgument;
+      }
+    }
+  } else if (declaration is InvalidTypeDeclarationBuilder) {
+    // Don't substitute.
+  } else {
+    assert(false, "Unexpected named type builder declaration: $declaration.");
+  }
+  if (newArguments != null) {
+    NamedTypeBuilder newTypeBuilder = type.withArguments(newArguments);
     if (declaration == null) {
-      assert(
-          identical(upperSubstitution, lowerSubstitution),
-          "Can only handle unbound named type builders identical "
-          "`upperSubstitution` and `lowerSubstitution`.");
-      for (int i = 0; i < type.arguments!.length; ++i) {
-        TypeBuilder substitutedArgument = substituteRange(
-            type.arguments![i],
-            upperSubstitution,
-            lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: variance);
-        if (substitutedArgument != type.arguments![i]) {
-          arguments ??= type.arguments!.toList();
-          arguments[i] = substitutedArgument;
-        }
-      }
-    } else if (declaration is ClassBuilder) {
-      for (int i = 0; i < type.arguments!.length; ++i) {
-        TypeBuilder substitutedArgument = substituteRange(
-            type.arguments![i],
-            upperSubstitution,
-            lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: variance);
-        if (substitutedArgument != type.arguments![i]) {
-          arguments ??= type.arguments!.toList();
-          arguments[i] = substitutedArgument;
-        }
-      }
-    } else if (declaration is ExtensionTypeDeclarationBuilder) {
-      for (int i = 0; i < type.arguments!.length; ++i) {
-        TypeBuilder substitutedArgument = substituteRange(
-            type.arguments![i],
-            upperSubstitution,
-            lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: variance);
-        if (substitutedArgument != type.arguments![i]) {
-          arguments ??= type.arguments!.toList();
-          arguments[i] = substitutedArgument;
-        }
-      }
-    } else if (declaration is TypeAliasBuilder) {
-      for (int i = 0; i < type.arguments!.length; ++i) {
-        TypeVariableBuilder variable = declaration.typeVariables![i];
-        TypeBuilder substitutedArgument = substituteRange(
-            type.arguments![i],
-            upperSubstitution,
-            lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: Variance.combine(variance, variable.variance));
-        if (substitutedArgument != type.arguments![i]) {
-          arguments ??= type.arguments!.toList();
-          arguments[i] = substitutedArgument;
-        }
-      }
-    } else if (declaration is InvalidTypeDeclarationBuilder) {
-      // Don't substitute.
-    } else {
-      assert(false, "Unexpected named type builder declaration: $declaration.");
+      unboundTypes.add(newTypeBuilder);
     }
-    if (arguments != null) {
-      NamedTypeBuilder newTypeBuilder = type.withArguments(arguments);
-      if (declaration == null) {
-        unboundTypes.add(newTypeBuilder);
-      }
-      return newTypeBuilder;
-    }
-    return type;
-  } else if (type is FunctionTypeBuilder) {
-    List<TypeVariableBuilder>? variables;
-    if (type.typeVariables != null) {
-      variables = new List<TypeVariableBuilder>.filled(
-          type.typeVariables!.length, dummyTypeVariableBuilder);
-    }
-    List<ParameterBuilder>? formals;
-    if (type.formals != null) {
-      formals = new List<ParameterBuilder>.filled(
-          type.formals!.length, dummyFormalParameterBuilder);
-    }
-    TypeBuilder? returnType;
-    bool changed = false;
+    return newTypeBuilder;
+  }
+  return type;
+}
 
-    Map<TypeVariableBuilder, TypeBuilder>? functionTypeUpperSubstitution;
-    Map<TypeVariableBuilder, TypeBuilder>? functionTypeLowerSubstitution;
-    if (type.typeVariables != null) {
-      for (int i = 0; i < variables!.length; i++) {
-        TypeVariableBuilder variable = type.typeVariables![i];
-        TypeBuilder? bound;
-        if (variable.bound != null) {
-          bound = substituteRange(variable.bound!, upperSubstitution,
-              lowerSubstitution, unboundTypes, unboundTypeVariables,
-              variance: Variance.invariant);
-        }
-        if (bound != variable.bound) {
-          TypeVariableBuilder newTypeVariableBuilder = variables[i] =
-              new TypeVariableBuilder(variable.name, variable.parent,
-                  variable.charOffset, variable.fileUri,
-                  bound: bound, kind: TypeVariableKind.function);
-          unboundTypeVariables.add(newTypeVariableBuilder);
-          if (functionTypeUpperSubstitution == null) {
-            functionTypeUpperSubstitution = {}..addAll(upperSubstitution);
-            functionTypeLowerSubstitution = {}..addAll(lowerSubstitution);
-          }
-          functionTypeUpperSubstitution[variable] =
-              functionTypeLowerSubstitution![variable] =
-                  new NamedTypeBuilder.fromTypeDeclarationBuilder(
-                      newTypeVariableBuilder,
-                      const NullabilityBuilder.omitted(),
-                      instanceTypeVariableAccess:
-                          InstanceTypeVariableAccessState.Unexpected);
-          changed = true;
-        } else {
-          variables[i] = variable;
-        }
-      }
-    }
-    if (type.formals != null) {
-      for (int i = 0; i < formals!.length; i++) {
-        ParameterBuilder formal = type.formals![i];
-        TypeBuilder parameterType = substituteRange(
-            formal.type,
-            functionTypeUpperSubstitution ?? upperSubstitution,
-            functionTypeLowerSubstitution ?? lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: Variance.combine(variance, Variance.contravariant));
-        if (parameterType != formal.type) {
-          formals[i] = new FunctionTypeParameterBuilder(
-              formal.metadata, formal.kind, parameterType, formal.name);
-          changed = true;
-        } else {
-          formals[i] = formal;
-        }
-      }
-    }
-    returnType = substituteRange(
-        type.returnType,
-        functionTypeUpperSubstitution ?? upperSubstitution,
-        functionTypeLowerSubstitution ?? lowerSubstitution,
-        unboundTypes,
-        unboundTypeVariables,
-        variance: variance);
-    changed = changed || returnType != type.returnType;
+TypeBuilder _substituteFunctionTypeBuilder(
+    FunctionTypeBuilder type,
+    Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
+    Map<TypeVariableBuilder, TypeBuilder> lowerSubstitution,
+    List<TypeBuilder> unboundTypes,
+    List<TypeVariableBuilder> unboundTypeVariables,
+    {final int variance = Variance.covariant}) {
+  List<TypeVariableBuilder>? typeVariables = type.typeVariables;
+  List<ParameterBuilder>? formals = type.formals;
+  TypeBuilder returnType = type.returnType;
 
-    if (changed) {
-      return new FunctionTypeBuilder(returnType, variables, formals,
-          type.nullabilityBuilder, type.fileUri, type.charOffset);
-    }
-    return type;
-  } else if (type is RecordTypeBuilder) {
-    bool changed = false;
+  List<TypeVariableBuilder>? newTypeVariables;
+  if (typeVariables != null) {
+    newTypeVariables = new List<TypeVariableBuilder>.filled(
+        typeVariables.length, dummyTypeVariableBuilder);
+  }
+  List<ParameterBuilder>? newFormals;
+  TypeBuilder newReturnType;
+  bool changed = false;
 
-    List<RecordTypeFieldBuilder>? positional = type.positionalFields != null
-        ? new List<RecordTypeFieldBuilder>.of(type.positionalFields!)
-        : null;
-    List<RecordTypeFieldBuilder>? named = type.namedFields != null
-        ? new List<RecordTypeFieldBuilder>.of(type.namedFields!)
-        : null;
-    if (positional != null) {
-      for (int i = 0; i < positional.length; i++) {
-        RecordTypeFieldBuilder positionalFieldBuilder = positional[i];
-        TypeBuilder positionalFieldType = substituteRange(
-            positionalFieldBuilder.type,
-            upperSubstitution,
-            lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: variance);
-        if (positionalFieldType != positionalFieldBuilder.type) {
-          positional[i] = new RecordTypeFieldBuilder(
-              positionalFieldBuilder.metadata,
-              positionalFieldType,
-              positionalFieldBuilder.name,
-              positionalFieldBuilder.charOffset);
-          changed = true;
+  Map<TypeVariableBuilder, TypeBuilder>? functionTypeUpperSubstitution;
+  Map<TypeVariableBuilder, TypeBuilder>? functionTypeLowerSubstitution;
+  if (typeVariables != null) {
+    for (int i = 0; i < newTypeVariables!.length; i++) {
+      TypeVariableBuilder variable = typeVariables[i];
+      TypeBuilder? bound;
+      if (variable.bound != null) {
+        bound = substituteRange(variable.bound!, upperSubstitution,
+            lowerSubstitution, unboundTypes, unboundTypeVariables,
+            variance: Variance.invariant);
+      }
+      if (bound != variable.bound) {
+        TypeVariableBuilder newTypeVariableBuilder = newTypeVariables[i] =
+            new TypeVariableBuilder(variable.name, variable.parent,
+                variable.charOffset, variable.fileUri,
+                bound: bound, kind: TypeVariableKind.function);
+        unboundTypeVariables.add(newTypeVariableBuilder);
+        if (functionTypeUpperSubstitution == null) {
+          functionTypeUpperSubstitution = {}..addAll(upperSubstitution);
+          functionTypeLowerSubstitution = {}..addAll(lowerSubstitution);
         }
+        functionTypeUpperSubstitution[variable] =
+            functionTypeLowerSubstitution![variable] =
+                new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
+                    newTypeVariableBuilder, const NullabilityBuilder.omitted(),
+                    instanceTypeVariableAccess:
+                        InstanceTypeVariableAccessState.Unexpected);
+        changed = true;
+      } else {
+        newTypeVariables[i] = variable;
       }
     }
-    if (named != null) {
-      for (int i = 0; i < named.length; i++) {
-        RecordTypeFieldBuilder namedFieldBuilder = named[i];
-        TypeBuilder namedFieldType = substituteRange(
-            namedFieldBuilder.type,
-            upperSubstitution,
-            lowerSubstitution,
-            unboundTypes,
-            unboundTypeVariables,
-            variance: variance);
-        if (namedFieldType != namedFieldBuilder.type) {
-          named[i] = new RecordTypeFieldBuilder(
-              namedFieldBuilder.metadata,
-              namedFieldType,
-              namedFieldBuilder.name,
-              namedFieldBuilder.charOffset);
-          changed = true;
-        }
+  }
+  if (formals != null) {
+    newFormals = new List<ParameterBuilder>.filled(
+        formals.length, dummyFormalParameterBuilder);
+    for (int i = 0; i < formals.length; i++) {
+      ParameterBuilder formal = formals[i];
+      TypeBuilder parameterType = substituteRange(
+          formal.type,
+          functionTypeUpperSubstitution ?? upperSubstitution,
+          functionTypeLowerSubstitution ?? lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: Variance.combine(variance, Variance.contravariant));
+      if (parameterType != formal.type) {
+        newFormals[i] = new FunctionTypeParameterBuilder(
+            formal.metadata, formal.kind, parameterType, formal.name);
+        changed = true;
+      } else {
+        newFormals[i] = formal;
       }
     }
+  }
+  newReturnType = substituteRange(
+      returnType,
+      functionTypeUpperSubstitution ?? upperSubstitution,
+      functionTypeLowerSubstitution ?? lowerSubstitution,
+      unboundTypes,
+      unboundTypeVariables,
+      variance: variance);
+  changed = changed || newReturnType != returnType;
 
-    if (changed) {
-      return new RecordTypeBuilder(positional, named, type.nullabilityBuilder,
-          type.fileUri, type.charOffset);
+  if (changed) {
+    return new FunctionTypeBuilderImpl(newReturnType, newTypeVariables,
+        newFormals, type.nullabilityBuilder, type.fileUri, type.charOffset);
+  }
+  return type;
+}
+
+TypeBuilder _substituteRecordTypeBuilder(
+    RecordTypeBuilder type,
+    Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
+    Map<TypeVariableBuilder, TypeBuilder> lowerSubstitution,
+    List<TypeBuilder> unboundTypes,
+    List<TypeVariableBuilder> unboundTypeVariables,
+    {final int variance = Variance.covariant}) {
+  List<RecordTypeFieldBuilder>? positionalFields = type.positionalFields;
+  List<RecordTypeFieldBuilder>? namedFields = type.namedFields;
+
+  bool changed = false;
+  List<RecordTypeFieldBuilder>? newPositionalFields = positionalFields != null
+      ? new List<RecordTypeFieldBuilder>.of(positionalFields)
+      : null;
+  List<RecordTypeFieldBuilder>? newNamedFields = namedFields != null
+      ? new List<RecordTypeFieldBuilder>.of(namedFields)
+      : null;
+  if (newPositionalFields != null) {
+    for (int i = 0; i < newPositionalFields.length; i++) {
+      RecordTypeFieldBuilder positionalFieldBuilder = newPositionalFields[i];
+      TypeBuilder positionalFieldType = substituteRange(
+          positionalFieldBuilder.type,
+          upperSubstitution,
+          lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: variance);
+      if (positionalFieldType != positionalFieldBuilder.type) {
+        newPositionalFields[i] = new RecordTypeFieldBuilder(
+            positionalFieldBuilder.metadata,
+            positionalFieldType,
+            positionalFieldBuilder.name,
+            positionalFieldBuilder.charOffset);
+        changed = true;
+      }
     }
-    return type;
+  }
+  if (newNamedFields != null) {
+    for (int i = 0; i < newNamedFields.length; i++) {
+      RecordTypeFieldBuilder namedFieldBuilder = newNamedFields[i];
+      TypeBuilder namedFieldType = substituteRange(
+          namedFieldBuilder.type,
+          upperSubstitution,
+          lowerSubstitution,
+          unboundTypes,
+          unboundTypeVariables,
+          variance: variance);
+      if (namedFieldType != namedFieldBuilder.type) {
+        newNamedFields[i] = new RecordTypeFieldBuilder(
+            namedFieldBuilder.metadata,
+            namedFieldType,
+            namedFieldBuilder.name,
+            namedFieldBuilder.charOffset);
+        changed = true;
+      }
+    }
+  }
+
+  if (changed) {
+    return new RecordTypeBuilderImpl(newPositionalFields, newNamedFields,
+        type.nullabilityBuilder, type.fileUri, type.charOffset);
   }
   return type;
 }
@@ -515,28 +594,54 @@
     }, growable: false);
 
     void collectReferencesFrom(int index, TypeBuilder? type) {
-      if (type is NamedTypeBuilder) {
-        if (type.declaration is TypeVariableBuilder &&
-            this.variables.contains(type.declaration)) {
-          edges[variableIndices[type.declaration]!].add(index);
-        }
-        if (type.arguments != null) {
-          for (TypeBuilder argument in type.arguments!) {
-            collectReferencesFrom(index, argument);
+      switch (type) {
+        case NamedTypeBuilder(
+            :TypeDeclarationBuilder? declaration,
+            :List<TypeBuilder>? arguments
+          ):
+          if (declaration is TypeVariableBuilder &&
+              this.variables.contains(declaration)) {
+            edges[variableIndices[declaration]!].add(index);
           }
-        }
-      } else if (type is FunctionTypeBuilder) {
-        if (type.typeVariables != null) {
-          for (TypeVariableBuilder typeVariable in type.typeVariables!) {
-            collectReferencesFrom(index, typeVariable.bound);
+          if (arguments != null) {
+            for (TypeBuilder argument in arguments) {
+              collectReferencesFrom(index, argument);
+            }
           }
-        }
-        if (type.formals != null) {
-          for (ParameterBuilder parameter in type.formals!) {
-            collectReferencesFrom(index, parameter.type);
+        case FunctionTypeBuilder(
+            :List<TypeVariableBuilder>? typeVariables,
+            :List<ParameterBuilder>? formals,
+            :TypeBuilder returnType
+          ):
+          if (typeVariables != null) {
+            for (TypeVariableBuilder typeVariable in typeVariables) {
+              collectReferencesFrom(index, typeVariable.bound);
+            }
           }
-        }
-        collectReferencesFrom(index, type.returnType);
+          if (formals != null) {
+            for (ParameterBuilder parameter in formals) {
+              collectReferencesFrom(index, parameter.type);
+            }
+          }
+          collectReferencesFrom(index, returnType);
+        case RecordTypeBuilder(
+            :List<RecordTypeFieldBuilder>? positionalFields,
+            :List<RecordTypeFieldBuilder>? namedFields
+          ):
+          if (positionalFields != null) {
+            for (RecordTypeFieldBuilder field in positionalFields) {
+              collectReferencesFrom(index, field.type);
+            }
+          }
+          if (namedFields != null) {
+            for (RecordTypeFieldBuilder field in namedFields) {
+              collectReferencesFrom(index, field.type);
+            }
+          }
+        case FixedTypeBuilder():
+        case InvalidTypeBuilder():
+        case OmittedTypeBuilder():
+        case null:
       }
     }
 
@@ -561,35 +666,62 @@
   TypeBuilder? type,
 ) {
   List<NamedTypeBuilder> uses = <NamedTypeBuilder>[];
-  if (type is NamedTypeBuilder) {
-    if (type.declaration == variable) {
-      uses.add(type);
-    } else {
-      if (type.arguments != null) {
-        for (TypeBuilder argument in type.arguments!) {
-          uses.addAll(findVariableUsesInType(variable, argument));
+  switch (type) {
+    case NamedTypeBuilder(
+        :TypeDeclarationBuilder? declaration,
+        :List<TypeBuilder>? arguments
+      ):
+      if (declaration == variable) {
+        uses.add(type);
+      } else {
+        if (arguments != null) {
+          for (TypeBuilder argument in arguments) {
+            uses.addAll(findVariableUsesInType(variable, argument));
+          }
         }
       }
-    }
-  } else if (type is FunctionTypeBuilder) {
-    uses.addAll(findVariableUsesInType(variable, type.returnType));
-    if (type.typeVariables != null) {
-      for (TypeVariableBuilder dependentVariable in type.typeVariables!) {
-        if (dependentVariable.bound != null) {
-          uses.addAll(
-              findVariableUsesInType(variable, dependentVariable.bound));
-        }
-        if (dependentVariable.defaultType != null) {
-          uses.addAll(
-              findVariableUsesInType(variable, dependentVariable.defaultType));
+      break;
+    case FunctionTypeBuilder(
+        :List<TypeVariableBuilder>? typeVariables,
+        :List<ParameterBuilder>? formals,
+        :TypeBuilder returnType
+      ):
+      uses.addAll(findVariableUsesInType(variable, returnType));
+      if (typeVariables != null) {
+        for (TypeVariableBuilder dependentVariable in typeVariables) {
+          if (dependentVariable.bound != null) {
+            uses.addAll(
+                findVariableUsesInType(variable, dependentVariable.bound));
+          }
+          if (dependentVariable.defaultType != null) {
+            uses.addAll(findVariableUsesInType(
+                variable, dependentVariable.defaultType));
+          }
         }
       }
-    }
-    if (type.formals != null) {
-      for (ParameterBuilder formal in type.formals!) {
-        uses.addAll(findVariableUsesInType(variable, formal.type));
+      if (formals != null) {
+        for (ParameterBuilder formal in formals) {
+          uses.addAll(findVariableUsesInType(variable, formal.type));
+        }
       }
-    }
+    case RecordTypeBuilder(
+        :List<RecordTypeFieldBuilder>? positionalFields,
+        :List<RecordTypeFieldBuilder>? namedFields
+      ):
+      if (positionalFields != null) {
+        for (RecordTypeFieldBuilder field in positionalFields) {
+          uses.addAll(findVariableUsesInType(variable, field.type));
+        }
+      }
+      if (namedFields != null) {
+        for (RecordTypeFieldBuilder field in namedFields) {
+          uses.addAll(findVariableUsesInType(variable, field.type));
+        }
+      }
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+    case OmittedTypeBuilder():
+    case null:
   }
   return uses;
 }
@@ -627,99 +759,127 @@
 /// [findInboundReferences].
 List<Object> findRawTypesWithInboundReferences(TypeBuilder? type) {
   List<Object> typesAndDependencies = <Object>[];
-  if (type is NamedTypeBuilder) {
-    if (type.arguments == null) {
-      TypeDeclarationBuilder? declaration = type.declaration;
-      if (declaration is DillClassBuilder) {
-        bool hasInbound = false;
-        List<TypeParameter> typeParameters = declaration.cls.typeParameters;
-        for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
-          if (containsTypeVariable(
-              typeParameters[i].bound, typeParameters.toSet())) {
-            hasInbound = true;
+  switch (type) {
+    case NamedTypeBuilder(
+        :TypeDeclarationBuilder? declaration,
+        :List<TypeBuilder>? arguments
+      ):
+      if (arguments == null) {
+        if (declaration is DillClassBuilder) {
+          bool hasInbound = false;
+          List<TypeParameter> typeParameters = declaration.cls.typeParameters;
+          for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
+            if (containsTypeVariable(
+                typeParameters[i].bound, typeParameters.toSet())) {
+              hasInbound = true;
+            }
           }
-        }
-        if (hasInbound) {
-          typesAndDependencies.add(type);
-          typesAndDependencies.add(const <Object>[]);
-        }
-      } else if (declaration is DillTypeAliasBuilder) {
-        bool hasInbound = false;
-        List<TypeParameter> typeParameters = declaration.typedef.typeParameters;
-        for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
-          if (containsTypeVariable(
-              typeParameters[i].bound, typeParameters.toSet())) {
-            hasInbound = true;
+          if (hasInbound) {
+            typesAndDependencies.add(type);
+            typesAndDependencies.add(const <Object>[]);
           }
-        }
-        if (hasInbound) {
-          typesAndDependencies.add(type);
-          typesAndDependencies.add(const <Object>[]);
-        }
-      } else if (declaration is ClassBuilder &&
-          declaration.typeVariables != null) {
-        List<Object> dependencies =
-            findInboundReferences(declaration.typeVariables!);
-        if (dependencies.length != 0) {
-          typesAndDependencies.add(type);
-          typesAndDependencies.add(dependencies);
-        }
-      } else if (declaration is ExtensionTypeDeclarationBuilder &&
-          declaration.typeParameters != null) {
-        List<Object> dependencies =
-            findInboundReferences(declaration.typeParameters!);
-        if (dependencies.length != 0) {
-          typesAndDependencies.add(type);
-          typesAndDependencies.add(dependencies);
-        }
-      } else if (declaration is TypeAliasBuilder) {
-        if (declaration.typeVariables != null) {
+        } else if (declaration is DillTypeAliasBuilder) {
+          bool hasInbound = false;
+          List<TypeParameter> typeParameters =
+              declaration.typedef.typeParameters;
+          for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
+            if (containsTypeVariable(
+                typeParameters[i].bound, typeParameters.toSet())) {
+              hasInbound = true;
+            }
+          }
+          if (hasInbound) {
+            typesAndDependencies.add(type);
+            typesAndDependencies.add(const <Object>[]);
+          }
+        } else if (declaration is ClassBuilder &&
+            declaration.typeVariables != null) {
           List<Object> dependencies =
               findInboundReferences(declaration.typeVariables!);
           if (dependencies.length != 0) {
             typesAndDependencies.add(type);
             typesAndDependencies.add(dependencies);
           }
-        }
-        if (declaration.type is FunctionTypeBuilder) {
-          FunctionTypeBuilder type = declaration.type as FunctionTypeBuilder;
-          if (type.typeVariables != null) {
+        } else if (declaration is ExtensionTypeDeclarationBuilder &&
+            declaration.typeParameters != null) {
+          List<Object> dependencies =
+              findInboundReferences(declaration.typeParameters!);
+          if (dependencies.length != 0) {
+            typesAndDependencies.add(type);
+            typesAndDependencies.add(dependencies);
+          }
+        } else if (declaration is TypeAliasBuilder) {
+          if (declaration.typeVariables != null) {
             List<Object> dependencies =
-                findInboundReferences(type.typeVariables!);
+                findInboundReferences(declaration.typeVariables!);
             if (dependencies.length != 0) {
               typesAndDependencies.add(type);
               typesAndDependencies.add(dependencies);
             }
           }
+          if (declaration.type is FunctionTypeBuilder) {
+            FunctionTypeBuilder type = declaration.type as FunctionTypeBuilder;
+            if (type.typeVariables != null) {
+              List<Object> dependencies =
+                  findInboundReferences(type.typeVariables!);
+              if (dependencies.length != 0) {
+                typesAndDependencies.add(type);
+                typesAndDependencies.add(dependencies);
+              }
+            }
+          }
         }
-      }
-    } else {
-      for (TypeBuilder argument in type.arguments!) {
-        typesAndDependencies
-            .addAll(findRawTypesWithInboundReferences(argument));
-      }
-    }
-  } else if (type is FunctionTypeBuilder) {
-    typesAndDependencies
-        .addAll(findRawTypesWithInboundReferences(type.returnType));
-    if (type.typeVariables != null) {
-      for (TypeVariableBuilder variable in type.typeVariables!) {
-        if (variable.bound != null) {
+      } else {
+        for (TypeBuilder argument in arguments) {
           typesAndDependencies
-              .addAll(findRawTypesWithInboundReferences(variable.bound));
+              .addAll(findRawTypesWithInboundReferences(argument));
         }
-        if (variable.defaultType != null) {
+      }
+    case FunctionTypeBuilder(
+        :List<TypeVariableBuilder>? typeVariables,
+        :List<ParameterBuilder>? formals,
+        :TypeBuilder returnType
+      ):
+      typesAndDependencies
+          .addAll(findRawTypesWithInboundReferences(returnType));
+      if (typeVariables != null) {
+        for (TypeVariableBuilder variable in typeVariables) {
+          if (variable.bound != null) {
+            typesAndDependencies
+                .addAll(findRawTypesWithInboundReferences(variable.bound));
+          }
+          if (variable.defaultType != null) {
+            typesAndDependencies.addAll(
+                findRawTypesWithInboundReferences(variable.defaultType));
+          }
+        }
+      }
+      if (formals != null) {
+        for (ParameterBuilder formal in formals) {
           typesAndDependencies
-              .addAll(findRawTypesWithInboundReferences(variable.defaultType));
+              .addAll(findRawTypesWithInboundReferences(formal.type));
         }
       }
-    }
-    if (type.formals != null) {
-      for (ParameterBuilder formal in type.formals!) {
-        typesAndDependencies
-            .addAll(findRawTypesWithInboundReferences(formal.type));
+    case RecordTypeBuilder(
+        :List<RecordTypeFieldBuilder>? positionalFields,
+        :List<RecordTypeFieldBuilder>? namedFields
+      ):
+      if (positionalFields != null) {
+        for (RecordTypeFieldBuilder field in positionalFields) {
+          typesAndDependencies
+              .addAll(findRawTypesWithInboundReferences(field.type));
+        }
       }
-    }
+      if (namedFields != null) {
+        for (RecordTypeFieldBuilder field in namedFields) {
+          typesAndDependencies
+              .addAll(findRawTypesWithInboundReferences(field.type));
+        }
+      }
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+    case OmittedTypeBuilder():
+    case null:
   }
   return typesAndDependencies;
 }
@@ -812,80 +972,110 @@
   visited ??= new Set<TypeDeclarationBuilder>.identity();
   List<List<RawTypeCycleElement>> paths = <List<RawTypeCycleElement>>[];
 
-  if (start is NamedTypeBuilder) {
-    void visitTypeVariables(List<TypeVariableBuilder>? typeVariables) {
-      if (typeVariables == null) return;
+  switch (start) {
+    case NamedTypeBuilder(
+        :TypeDeclarationBuilder? declaration,
+        :List<TypeBuilder>? arguments
+      ):
+      void visitTypeVariables(List<TypeVariableBuilder>? typeVariables) {
+        if (typeVariables == null) return;
 
-      for (TypeVariableBuilder variable in typeVariables) {
-        if (variable.bound != null) {
-          for (List<RawTypeCycleElement> path
-              in findRawTypePathsToDeclaration(variable.bound, end, visited)) {
-            if (path.isNotEmpty) {
-              paths.add(<RawTypeCycleElement>[
-                new RawTypeCycleElement(start, null)
-              ]..addAll(path..first.typeVariable = variable));
+        for (TypeVariableBuilder variable in typeVariables) {
+          if (variable.bound != null) {
+            for (List<RawTypeCycleElement> path
+                in findRawTypePathsToDeclaration(
+                    variable.bound, end, visited)) {
+              if (path.isNotEmpty) {
+                paths.add(<RawTypeCycleElement>[
+                  new RawTypeCycleElement(start, null)
+                ]..addAll(path..first.typeVariable = variable));
+              }
             }
           }
         }
       }
-    }
 
-    if (start.arguments == null) {
-      TypeDeclarationBuilder? declaration = start.declaration;
-      if (declaration == end) {
-        paths.add(<RawTypeCycleElement>[new RawTypeCycleElement(start, null)]);
-      } else if (visited.add(start.declaration!)) {
-        if (declaration is ClassBuilder) {
-          visitTypeVariables(declaration.typeVariables);
-        } else if (declaration is TypeAliasBuilder) {
-          visitTypeVariables(declaration.typeVariables);
-          if (declaration.type is FunctionTypeBuilder) {
-            FunctionTypeBuilder type = declaration.type as FunctionTypeBuilder;
-            visitTypeVariables(type.typeVariables);
+      if (arguments == null) {
+        if (declaration == end) {
+          paths
+              .add(<RawTypeCycleElement>[new RawTypeCycleElement(start, null)]);
+        } else if (visited.add(start.declaration!)) {
+          if (declaration is ClassBuilder) {
+            visitTypeVariables(declaration.typeVariables);
+          } else if (declaration is TypeAliasBuilder) {
+            visitTypeVariables(declaration.typeVariables);
+            if (declaration.type is FunctionTypeBuilder) {
+              FunctionTypeBuilder type =
+                  declaration.type as FunctionTypeBuilder;
+              visitTypeVariables(type.typeVariables);
+            }
+          } else if (declaration is ExtensionBuilder) {
+            visitTypeVariables(declaration.typeParameters);
+          } else if (declaration is ExtensionTypeDeclarationBuilder) {
+            visitTypeVariables(declaration.typeParameters);
+          } else if (declaration is TypeVariableBuilder) {
+            // Do nothing. The type variable is handled by its parent
+            // declaration.
+          } else if (declaration is BuiltinTypeDeclarationBuilder) {
+            // Do nothing.
+          } else if (declaration is InvalidTypeDeclarationBuilder) {
+            // Do nothing.
+          } else {
+            unhandled(
+                '$declaration (${declaration.runtimeType})',
+                'findRawTypePathsToDeclaration',
+                declaration?.charOffset ?? -1,
+                declaration?.fileUri);
           }
-        } else if (declaration is ExtensionBuilder) {
-          visitTypeVariables(declaration.typeParameters);
-        } else if (declaration is ExtensionTypeDeclarationBuilder) {
-          visitTypeVariables(declaration.typeParameters);
-        } else if (declaration is TypeVariableBuilder) {
-          // Do nothing. The type variable is handled by its parent declaration.
-        } else if (declaration is BuiltinTypeDeclarationBuilder) {
-          // Do nothing.
-        } else if (declaration is InvalidTypeDeclarationBuilder) {
-          // Do nothing.
-        } else {
-          unhandled(
-              '$declaration (${declaration.runtimeType})',
-              'findRawTypePathsToDeclaration',
-              declaration?.charOffset ?? -1,
-              declaration?.fileUri);
+          visited.remove(declaration);
         }
-        visited.remove(declaration);
-      }
-    } else {
-      for (TypeBuilder argument in start.arguments!) {
-        paths.addAll(findRawTypePathsToDeclaration(argument, end, visited));
-      }
-    }
-  } else if (start is FunctionTypeBuilder) {
-    paths.addAll(findRawTypePathsToDeclaration(start.returnType, end, visited));
-    if (start.typeVariables != null) {
-      for (TypeVariableBuilder variable in start.typeVariables!) {
-        if (variable.bound != null) {
-          paths.addAll(
-              findRawTypePathsToDeclaration(variable.bound, end, visited));
-        }
-        if (variable.defaultType != null) {
-          paths.addAll(findRawTypePathsToDeclaration(
-              variable.defaultType, end, visited));
+      } else {
+        for (TypeBuilder argument in arguments) {
+          paths.addAll(findRawTypePathsToDeclaration(argument, end, visited));
         }
       }
-    }
-    if (start.formals != null) {
-      for (ParameterBuilder formal in start.formals!) {
-        paths.addAll(findRawTypePathsToDeclaration(formal.type, end, visited));
+    case FunctionTypeBuilder(
+        :List<TypeVariableBuilder>? typeVariables,
+        :List<ParameterBuilder>? formals,
+        :TypeBuilder returnType
+      ):
+      paths.addAll(findRawTypePathsToDeclaration(returnType, end, visited));
+      if (typeVariables != null) {
+        for (TypeVariableBuilder variable in typeVariables) {
+          if (variable.bound != null) {
+            paths.addAll(
+                findRawTypePathsToDeclaration(variable.bound, end, visited));
+          }
+          if (variable.defaultType != null) {
+            paths.addAll(findRawTypePathsToDeclaration(
+                variable.defaultType, end, visited));
+          }
+        }
       }
-    }
+      if (formals != null) {
+        for (ParameterBuilder formal in formals) {
+          paths
+              .addAll(findRawTypePathsToDeclaration(formal.type, end, visited));
+        }
+      }
+    case RecordTypeBuilder(
+        :List<RecordTypeFieldBuilder>? positionalFields,
+        :List<RecordTypeFieldBuilder>? namedFields
+      ):
+      if (positionalFields != null) {
+        for (RecordTypeFieldBuilder field in positionalFields) {
+          paths.addAll(findRawTypePathsToDeclaration(field.type, end, visited));
+        }
+      }
+      if (namedFields != null) {
+        for (RecordTypeFieldBuilder field in namedFields) {
+          paths.addAll(findRawTypePathsToDeclaration(field.type, end, visited));
+        }
+      }
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+    case OmittedTypeBuilder():
+    case null:
   }
   return paths;
 }
@@ -1086,66 +1276,51 @@
 /// Finds generic function type sub-terms in [type].
 void findUnaliasedGenericFunctionTypes(TypeBuilder? type,
     {required List<FunctionTypeBuilder> result}) {
-  if (type is FunctionTypeBuilder) {
-    if (type.typeVariables != null && type.typeVariables!.length > 0) {
-      result.add(type);
-
-      for (TypeVariableBuilder typeVariable in type.typeVariables!) {
-        findUnaliasedGenericFunctionTypes(typeVariable.bound, result: result);
-        findUnaliasedGenericFunctionTypes(typeVariable.defaultType,
-            result: result);
-      }
-    }
-    findUnaliasedGenericFunctionTypes(type.returnType, result: result);
-    if (type.formals != null) {
-      for (ParameterBuilder formal in type.formals!) {
-        findUnaliasedGenericFunctionTypes(formal.type, result: result);
-      }
-    }
-  } else if (type is NamedTypeBuilder) {
-    if (type.arguments != null) {
-      for (TypeBuilder argument in type.arguments!) {
-        findUnaliasedGenericFunctionTypes(argument, result: result);
-      }
-    }
-  }
-}
-
-/// Finds generic function type sub-terms in [type] including the aliased ones.
-void findGenericFunctionTypes(TypeBuilder? type,
-    {required List<TypeBuilder> result}) {
-  if (type is FunctionTypeBuilder) {
-    if (type.typeVariables != null && type.typeVariables!.length > 0) {
-      result.add(type);
-
-      for (TypeVariableBuilder typeVariable in type.typeVariables!) {
-        findGenericFunctionTypes(typeVariable.bound, result: result);
-        findGenericFunctionTypes(typeVariable.defaultType, result: result);
-      }
-    }
-    findGenericFunctionTypes(type.returnType, result: result);
-    if (type.formals != null) {
-      for (ParameterBuilder formal in type.formals!) {
-        findGenericFunctionTypes(formal.type, result: result);
-      }
-    }
-  } else if (type is NamedTypeBuilder) {
-    if (type.arguments != null) {
-      for (TypeBuilder argument in type.arguments!) {
-        findGenericFunctionTypes(argument, result: result);
-      }
-    }
-
-    TypeDeclarationBuilder? declaration = type.declaration;
-    // TODO(cstefantsova): Unalias beyond the first layer for the check.
-    if (declaration is TypeAliasBuilder) {
-      TypeBuilder? rhsType = declaration.type;
-      if (rhsType is FunctionTypeBuilder &&
-          rhsType.typeVariables != null &&
-          rhsType.typeVariables!.isNotEmpty) {
+  switch (type) {
+    case FunctionTypeBuilder(
+        :List<TypeVariableBuilder>? typeVariables,
+        :List<ParameterBuilder>? formals,
+        :TypeBuilder returnType
+      ):
+      if (typeVariables != null && typeVariables.length > 0) {
         result.add(type);
+
+        for (TypeVariableBuilder typeVariable in typeVariables) {
+          findUnaliasedGenericFunctionTypes(typeVariable.bound, result: result);
+          findUnaliasedGenericFunctionTypes(typeVariable.defaultType,
+              result: result);
+        }
       }
-    }
+      findUnaliasedGenericFunctionTypes(returnType, result: result);
+      if (formals != null) {
+        for (ParameterBuilder formal in formals) {
+          findUnaliasedGenericFunctionTypes(formal.type, result: result);
+        }
+      }
+    case NamedTypeBuilder(:List<TypeBuilder>? arguments):
+      if (arguments != null) {
+        for (TypeBuilder argument in arguments) {
+          findUnaliasedGenericFunctionTypes(argument, result: result);
+        }
+      }
+    case RecordTypeBuilder(
+        :List<RecordTypeFieldBuilder>? positionalFields,
+        :List<RecordTypeFieldBuilder>? namedFields
+      ):
+      if (positionalFields != null) {
+        for (RecordTypeFieldBuilder field in positionalFields) {
+          findUnaliasedGenericFunctionTypes(field.type, result: result);
+        }
+      }
+      if (namedFields != null) {
+        for (RecordTypeFieldBuilder field in namedFields) {
+          findUnaliasedGenericFunctionTypes(field.type, result: result);
+        }
+      }
+    case FixedTypeBuilder():
+    case InvalidTypeBuilder():
+    case OmittedTypeBuilder():
+    case null:
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 5b66ae0..5311736 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -63,33 +63,33 @@
 
   @override
   TypeBuilder visitInvalidType(InvalidType node) {
-    return new FixedTypeBuilder(
+    return new FixedTypeBuilderImpl(
         node, /* fileUri = */ null, /* charOffset = */ null);
   }
 
   @override
   TypeBuilder visitDynamicType(DynamicType node) {
     // 'dynamic' is always nullable.
-    return new NamedTypeBuilder.forDartType(
+    return new NamedTypeBuilderImpl.forDartType(
         node, dynamicDeclaration, const NullabilityBuilder.inherent());
   }
 
   @override
   TypeBuilder visitVoidType(VoidType node) {
     // 'void' is always nullable.
-    return new NamedTypeBuilder.forDartType(
+    return new NamedTypeBuilderImpl.forDartType(
         node, voidDeclaration, const NullabilityBuilder.inherent());
   }
 
   @override
   TypeBuilder visitNeverType(NeverType node) {
-    return new NamedTypeBuilder.forDartType(node, neverDeclaration,
+    return new NamedTypeBuilderImpl.forDartType(node, neverDeclaration,
         new NullabilityBuilder.fromNullability(node.nullability));
   }
 
   @override
   TypeBuilder visitNullType(NullType node) {
-    return new NamedTypeBuilder.forDartType(
+    return new NamedTypeBuilderImpl.forDartType(
         node, nullDeclaration, const NullabilityBuilder.inherent());
   }
 
@@ -104,7 +104,7 @@
           kernelArguments.length, (int i) => kernelArguments[i].accept(this),
           growable: false);
     }
-    return new NamedTypeBuilder.forDartType(
+    return new NamedTypeBuilderImpl.forDartType(
         node, cls, new NullabilityBuilder.fromNullability(node.nullability),
         arguments: arguments);
   }
@@ -121,7 +121,7 @@
           kernelArguments.length, (int i) => kernelArguments[i].accept(this),
           growable: false);
     }
-    return new NamedTypeBuilder.forDartType(node, extensionTypeDeclaration,
+    return new NamedTypeBuilderImpl.forDartType(node, extensionTypeDeclaration,
         new NullabilityBuilder.fromNullability(node.nullability),
         arguments: arguments);
   }
@@ -129,7 +129,7 @@
   @override
   TypeBuilder visitFutureOrType(FutureOrType node) {
     TypeBuilder argument = node.typeArgument.accept(this);
-    return new NamedTypeBuilder.forDartType(node, futureOrDeclaration,
+    return new NamedTypeBuilderImpl.forDartType(node, futureOrDeclaration,
         new NullabilityBuilder.fromNullability(node.nullability),
         arguments: [argument]);
   }
@@ -164,7 +164,7 @@
           new FunctionTypeParameterBuilder(
               /* metadata = */ null, kind, type, parameter.name);
     }
-    return new FunctionTypeBuilder(
+    return new FunctionTypeBuilderImpl(
         returnType,
         typeVariables,
         formals,
@@ -185,7 +185,7 @@
     }
     LibraryBuilder library =
         loader.lookupLibraryBuilder(kernelLibrary!.importUri)!;
-    return new NamedTypeBuilder.fromTypeDeclarationBuilder(
+    return new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
         new TypeVariableBuilder.fromKernel(parameter, library),
         new NullabilityBuilder.fromNullability(node.nullability),
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Allowed,
@@ -224,7 +224,7 @@
           growable: false);
     }
 
-    return new RecordTypeBuilder(
+    return new RecordTypeBuilderImpl(
         positionalBuilders,
         namedBuilders,
         new NullabilityBuilder.fromNullability(node.nullability),
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index a841767..8cf4400 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -242,7 +242,7 @@
     new CombinatorBuilder(false, {}, -1, dummyUri);
 final MetadataBuilder dummyMetadataBuilder = new MetadataBuilder(dummyToken);
 final TypeBuilder dummyTypeBuilder =
-    new FixedTypeBuilder(dummyDartType, dummyUri, -1);
+    new FixedTypeBuilderImpl(dummyDartType, dummyUri, -1);
 final FormalParameterBuilder dummyFormalParameterBuilder =
     new FormalParameterBuilder(null, FormalParameterKind.requiredPositional, 0,
         const ImplicitTypeBuilder(), '', null, -1,
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index ec09839..23e32ea 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -26,7 +26,6 @@
 import '../builder/declaration_builder.dart';
 import '../builder/extension_builder.dart';
 import '../builder/formal_parameter_builder.dart';
-import '../builder/function_type_builder.dart';
 import '../builder/metadata_builder.dart';
 import '../builder/modifier_builder.dart';
 import '../builder/type_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 5410993..f846f8e 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -29,7 +29,6 @@
 import '../builder/constructor_reference_builder.dart';
 import '../builder/fixed_type_builder.dart';
 import '../builder/formal_parameter_builder.dart';
-import '../builder/function_type_builder.dart';
 import '../builder/invalid_type_builder.dart';
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/metadata_builder.dart';
@@ -1474,7 +1473,7 @@
     Object? onType = pop();
     if (onType is ParserRecovery) {
       ParserRecovery parserRecovery = onType;
-      onType = new FixedTypeBuilder(
+      onType = new FixedTypeBuilderImpl(
           const InvalidType(), uri, parserRecovery.charOffset);
     }
     List<TypeVariableBuilder>? typeVariables =
@@ -1942,7 +1941,7 @@
       substitution = {};
       for (int i = 0; i < synthesizedTypeVariables.length; i++) {
         substitution[enclosingDeclarationScopeBuilder.typeVariables![i]] =
-            new NamedTypeBuilder.fromTypeDeclarationBuilder(
+            new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
                 synthesizedTypeVariables[i], const NullabilityBuilder.omitted(),
                 instanceTypeVariableAccess:
                     declarationContext.instanceTypeVariableAccessState);
@@ -2139,7 +2138,7 @@
                     ? new List<TypeBuilder>.generate(
                         declaration.typeVariables!.length,
                         (int index) =>
-                            new NamedTypeBuilder.fromTypeDeclarationBuilder(
+                            new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
                                 typeVariables![index],
                                 const NullabilityBuilder.omitted(),
                                 instanceTypeVariableAccess:
@@ -2907,7 +2906,7 @@
         const FixedNullableList<RecordTypeFieldBuilder>().popNonNullable(stack,
             hasNamedFields ? count - 1 : count, dummyRecordTypeFieldBuilder);
 
-    push(new RecordTypeBuilder(
+    push(new RecordTypeBuilderImpl(
       positionalFields,
       namedFields,
       questionMark != null
@@ -2942,7 +2941,7 @@
     push(new RecordTypeFieldBuilder(
         metadata,
         type is ParserRecovery
-            ? new InvalidTypeBuilder(uri, type.charOffset)
+            ? new InvalidTypeBuilderImpl(uri, type.charOffset)
             : type as TypeBuilder,
         name is String ? name : null,
         name is String ? nameOffset : -1));
@@ -3062,7 +3061,7 @@
           // elsewhere.
           addProblem(
               messageTypedefNullableType, equals.charOffset, equals.length);
-          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+          aliasedType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
               new InvalidTypeDeclarationBuilder(
                   "${name}",
                   messageTypedefNullableType.withLocation(
@@ -3083,7 +3082,7 @@
           aliasedType = type;
         } else {
           addProblem(messageTypedefNotType, equals.charOffset, equals.length);
-          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+          aliasedType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
               new InvalidTypeDeclarationBuilder(
                   "${name}",
                   messageTypedefNotType.withLocation(
@@ -3098,7 +3097,7 @@
         if (type is TypeBuilder) {
           addProblem(
               messageTypedefNotFunction, equals.charOffset, equals.length);
-          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+          aliasedType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
               new InvalidTypeDeclarationBuilder(
                   "${name}",
                   messageTypedefNotFunction.withLocation(
@@ -3108,7 +3107,7 @@
                   InstanceTypeVariableAccessState.Allowed);
         } else {
           addProblem(messageTypedefNotType, equals.charOffset, equals.length);
-          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+          aliasedType = new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
               new InvalidTypeDeclarationBuilder(
                   "${name}",
                   messageTypedefNotType.withLocation(
@@ -3406,7 +3405,7 @@
                 : templateCycleInTypeVariables.withArguments(
                     builder.name, via.join("', '"));
             addProblem(message, builder.charOffset, builder.name.length);
-            builder.bound = new NamedTypeBuilder(
+            builder.bound = new NamedTypeBuilderImpl(
                 builder.name, const NullabilityBuilder.omitted(),
                 fileUri: uri,
                 charOffset: builder.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 0476825..c758760 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -977,7 +977,7 @@
       }
     }
     if (message != null) {
-      return new NamedTypeBuilder(
+      return new NamedTypeBuilderImpl(
           supertype.name as String, const NullabilityBuilder.omitted(),
           fileUri: fileUri,
           charOffset: charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index c92af93..40d5336 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -15,7 +15,6 @@
 import '../builder/formal_parameter_builder.dart';
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
-import '../builder/named_type_builder.dart';
 import '../builder/omitted_type_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 5de9170..f963df5 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -151,7 +151,7 @@
 
     // TODO(ahe): These types shouldn't be looked up in scope, they come
     // directly from dart:core.
-    NamedTypeBuilder intType = new NamedTypeBuilder(
+    NamedTypeBuilder intType = new NamedTypeBuilderImpl(
         "int", const NullabilityBuilder.omitted(),
         instanceTypeVariableAccess:
             // If "int" resolves to an instance type variable then that we would
@@ -164,13 +164,13 @@
             // enhanced enums feature where enums can actually declare type
             // variables.
             InstanceTypeVariableAccessState.Unexpected);
-    NamedTypeBuilder stringType = new NamedTypeBuilder(
+    NamedTypeBuilder stringType = new NamedTypeBuilderImpl(
         "String", const NullabilityBuilder.omitted(),
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
-    NamedTypeBuilder objectType = new NamedTypeBuilder(
+    NamedTypeBuilder objectType = new NamedTypeBuilderImpl(
         "Object", const NullabilityBuilder.omitted(),
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
-    supertypeBuilder ??= new NamedTypeBuilder(
+    supertypeBuilder ??= new NamedTypeBuilderImpl(
         "_Enum", const NullabilityBuilder.omitted(),
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
     Class cls = new Class(
@@ -183,12 +183,12 @@
     Map<String, MemberBuilder> setters = <String, MemberBuilder>{};
     Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
     List<SourceFieldBuilder> elementBuilders = <SourceFieldBuilder>[];
-    NamedTypeBuilder selfType = new NamedTypeBuilder(
+    NamedTypeBuilder selfType = new NamedTypeBuilderImpl(
         name, const NullabilityBuilder.omitted(),
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected,
         fileUri: fileUri,
         charOffset: charOffset);
-    NamedTypeBuilder listType = new NamedTypeBuilder(
+    NamedTypeBuilder listType = new NamedTypeBuilderImpl(
         "List", const NullabilityBuilder.omitted(),
         arguments: <TypeBuilder>[selfType],
         instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart
index 8d68d9f..6b6f432 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart
@@ -2,7 +2,6 @@
 // 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:front_end/src/fasta/builder/function_type_builder.dart';
 import 'package:front_end/src/fasta/builder/record_type_builder.dart';
 import 'package:front_end/src/fasta/kernel/body_builder_context.dart';
 import 'package:kernel/ast.dart';
@@ -20,7 +19,6 @@
 import '../builder/member_builder.dart';
 import '../builder/metadata_builder.dart';
 import '../builder/name_iterator.dart';
-import '../builder/named_type_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
@@ -275,111 +273,119 @@
         // We allow creating new type variables during unaliasing. This type
         // variables are short-lived and therefore don't need to be bound.
         unboundTypeVariables: []);
-    if (unaliased is NamedTypeBuilder) {
-      TypeDeclarationBuilder? declaration = unaliased.declaration;
-      if (declaration is ExtensionTypeDeclarationBuilder) {
-        if (!seenExtensionTypeDeclarations.add(declaration)) {
-          List<LocatedMessage> context = [];
-          for (ExtensionTypeDeclarationBuilder extensionTypeDeclarationBuilder
-              in seenExtensionTypeDeclarations) {
-            if (extensionTypeDeclarationBuilder != this) {
-              context.add(messageExtensionTypeDeclarationCause.withLocation(
-                  extensionTypeDeclarationBuilder.fileUri,
-                  extensionTypeDeclarationBuilder.charOffset,
-                  extensionTypeDeclarationBuilder.name.length));
+    switch (unaliased) {
+      case NamedTypeBuilder(
+          :TypeDeclarationBuilder? declaration,
+          :List<TypeBuilder>? arguments
+        ):
+        if (declaration is ExtensionTypeDeclarationBuilder) {
+          if (!seenExtensionTypeDeclarations.add(declaration)) {
+            List<LocatedMessage> context = [];
+            for (ExtensionTypeDeclarationBuilder extensionTypeDeclarationBuilder
+                in seenExtensionTypeDeclarations) {
+              if (extensionTypeDeclarationBuilder != this) {
+                context.add(messageExtensionTypeDeclarationCause.withLocation(
+                    extensionTypeDeclarationBuilder.fileUri,
+                    extensionTypeDeclarationBuilder.charOffset,
+                    extensionTypeDeclarationBuilder.name.length));
+              }
+            }
+            for (TypeAliasBuilder typeAliasBuilder in usedTypeAliasBuilders) {
+              context.add(messageTypedefCause.withLocation(
+                  typeAliasBuilder.fileUri,
+                  typeAliasBuilder.charOffset,
+                  typeAliasBuilder.name.length));
+            }
+            libraryBuilder.addProblem(
+                messageCyclicRepresentationDependency,
+                representationFieldBuilder!.type.charOffset!,
+                noLength,
+                representationFieldBuilder!.type.fileUri,
+                context: context);
+            return true;
+          } else {
+            TypeBuilder? representationTypeBuilder =
+                declaration.declaredRepresentationTypeBuilder;
+            if (representationTypeBuilder != null) {
+              if (_checkRepresentationDependency(
+                  representationTypeBuilder,
+                  seenExtensionTypeDeclarations.toSet(),
+                  usedTypeAliasBuilders.toSet())) {
+                return true;
+              }
             }
           }
-          for (TypeAliasBuilder typeAliasBuilder in usedTypeAliasBuilders) {
-            context.add(messageTypedefCause.withLocation(
-                typeAliasBuilder.fileUri,
-                typeAliasBuilder.charOffset,
-                typeAliasBuilder.name.length));
-          }
-          libraryBuilder.addProblem(
-              messageCyclicRepresentationDependency,
-              representationFieldBuilder!.type.charOffset!,
-              noLength,
-              representationFieldBuilder!.type.fileUri,
-              context: context);
-          return true;
-        } else {
-          TypeBuilder? representationTypeBuilder =
-              declaration.declaredRepresentationTypeBuilder;
-          if (representationTypeBuilder != null) {
+        }
+        if (arguments != null) {
+          for (TypeBuilder typeArgument in arguments) {
             if (_checkRepresentationDependency(
-                representationTypeBuilder,
+                typeArgument,
                 seenExtensionTypeDeclarations.toSet(),
                 usedTypeAliasBuilders.toSet())) {
               return true;
             }
           }
         }
-      }
-      List<TypeBuilder>? typeArguments = unaliased.arguments;
-      if (typeArguments != null) {
-        for (TypeBuilder typeArgument in typeArguments) {
-          if (_checkRepresentationDependency(
-              typeArgument,
-              seenExtensionTypeDeclarations.toSet(),
-              usedTypeAliasBuilders.toSet())) {
-            return true;
+      case FunctionTypeBuilder(
+          :List<TypeVariableBuilder>? typeVariables,
+          :List<ParameterBuilder>? formals,
+          :TypeBuilder returnType
+        ):
+        if (_checkRepresentationDependency(
+            returnType,
+            seenExtensionTypeDeclarations.toSet(),
+            usedTypeAliasBuilders.toSet())) {
+          return true;
+        }
+        if (formals != null) {
+          for (ParameterBuilder formal in formals) {
+            if (_checkRepresentationDependency(
+                formal.type,
+                seenExtensionTypeDeclarations.toSet(),
+                usedTypeAliasBuilders.toSet())) {
+              return true;
+            }
           }
         }
-      }
-    } else if (unaliased is FunctionTypeBuilder) {
-      if (_checkRepresentationDependency(
-          unaliased.returnType,
-          seenExtensionTypeDeclarations.toSet(),
-          usedTypeAliasBuilders.toSet())) {
-        return true;
-      }
-      List<ParameterBuilder>? formals = unaliased.formals;
-      if (formals != null) {
-        for (ParameterBuilder formal in formals) {
-          if (_checkRepresentationDependency(
-              formal.type,
-              seenExtensionTypeDeclarations.toSet(),
-              usedTypeAliasBuilders.toSet())) {
-            return true;
+        if (typeVariables != null) {
+          for (TypeVariableBuilder typeVariable in typeVariables) {
+            TypeBuilder? bound = typeVariable.bound;
+            if (_checkRepresentationDependency(
+                bound,
+                seenExtensionTypeDeclarations.toSet(),
+                usedTypeAliasBuilders.toSet())) {
+              return true;
+            }
           }
         }
-      }
-      List<TypeVariableBuilder>? typeVariables = unaliased.typeVariables;
-      if (typeVariables != null) {
-        for (TypeVariableBuilder typeVariable in typeVariables) {
-          TypeBuilder? bound = typeVariable.bound;
-          if (_checkRepresentationDependency(
-              bound,
-              seenExtensionTypeDeclarations.toSet(),
-              usedTypeAliasBuilders.toSet())) {
-            return true;
+      case RecordTypeBuilder(
+          :List<RecordTypeFieldBuilder>? positionalFields,
+          :List<RecordTypeFieldBuilder>? namedFields
+        ):
+        if (positionalFields != null) {
+          for (RecordTypeFieldBuilder field in positionalFields) {
+            if (_checkRepresentationDependency(
+                field.type,
+                seenExtensionTypeDeclarations.toSet(),
+                usedTypeAliasBuilders.toSet())) {
+              return true;
+            }
           }
         }
-      }
-    } else if (unaliased is RecordTypeBuilder) {
-      List<RecordTypeFieldBuilder>? positionalFields =
-          unaliased.positionalFields;
-      if (positionalFields != null) {
-        for (RecordTypeFieldBuilder field in positionalFields) {
-          if (_checkRepresentationDependency(
-              field.type,
-              seenExtensionTypeDeclarations.toSet(),
-              usedTypeAliasBuilders.toSet())) {
-            return true;
+        if (namedFields != null) {
+          for (RecordTypeFieldBuilder field in namedFields) {
+            if (_checkRepresentationDependency(
+                field.type,
+                seenExtensionTypeDeclarations.toSet(),
+                usedTypeAliasBuilders.toSet())) {
+              return true;
+            }
           }
         }
-      }
-      List<RecordTypeFieldBuilder>? namedFields = unaliased.namedFields;
-      if (namedFields != null) {
-        for (RecordTypeFieldBuilder field in namedFields) {
-          if (_checkRepresentationDependency(
-              field.type,
-              seenExtensionTypeDeclarations.toSet(),
-              usedTypeAliasBuilders.toSet())) {
-            return true;
-          }
-        }
-      }
+      case OmittedTypeBuilder():
+      case FixedTypeBuilder():
+      case InvalidTypeBuilder():
+      case null:
     }
     return false;
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 4204f19..40a09e9 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -39,11 +39,10 @@
 import '../builder/extension_builder.dart';
 import '../builder/extension_type_declaration_builder.dart';
 import '../builder/field_builder.dart';
-import '../builder/fixed_type_builder.dart';
 import '../builder/formal_parameter_builder.dart';
 import '../builder/function_builder.dart';
 import '../builder/function_type_builder.dart';
-import '../builder/invalid_type_builder.dart';
+import '../builder/inferable_type_builder.dart';
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
@@ -1557,7 +1556,7 @@
       if (cls != objectClass) {
         cls.supertype ??= objectClass.asRawSupertype;
         declaration.supertypeBuilder ??=
-            new NamedTypeBuilder.fromTypeDeclarationBuilder(
+            new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
                 objectClassBuilder, const NullabilityBuilder.omitted(),
                 instanceTypeVariableAccess:
                     InstanceTypeVariableAccessState.Unexpected);
@@ -1757,7 +1756,7 @@
         return new DependentTypeBuilder(builder.omittedTypeBuilder);
       }
     }
-    return registerUnresolvedNamedType(new NamedTypeBuilder(
+    return registerUnresolvedNamedType(new NamedTypeBuilderImpl(
         name, nullabilityBuilder,
         arguments: arguments,
         fileUri: fileUri,
@@ -1772,7 +1771,7 @@
 
   TypeBuilder addVoidType(int charOffset) {
     // 'void' is always nullable.
-    return new NamedTypeBuilder.fromTypeDeclarationBuilder(
+    return new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
         new VoidTypeDeclarationBuilder(const VoidType(), this, charOffset),
         const NullabilityBuilder.inherent(),
         charOffset: charOffset,
@@ -2555,72 +2554,64 @@
       /// Helper function that returns `true` if a type variable with a name
       /// from [typeVariableNames] is referenced in [type].
       bool usesTypeVariables(TypeBuilder? type) {
-        if (type is NamedTypeBuilder) {
-          if (type.declaration is TypeVariableBuilder) {
-            return typeVariableNames!.contains(type.declaration!.name);
-          }
+        switch (type) {
+          case NamedTypeBuilder(
+              :TypeDeclarationBuilder? declaration,
+              :List<TypeBuilder>? arguments
+            ):
+            if (declaration is TypeVariableBuilder) {
+              return typeVariableNames!.contains(declaration.name);
+            }
 
-          List<TypeBuilder>? typeArguments = type.arguments;
-          if (typeArguments != null && typeVariables != null) {
-            for (TypeBuilder argument in typeArguments) {
-              if (usesTypeVariables(argument)) {
-                return true;
+            if (arguments != null && typeVariables != null) {
+              for (TypeBuilder argument in arguments) {
+                if (usesTypeVariables(argument)) {
+                  return true;
+                }
               }
             }
-          }
-        } else if (type is FunctionTypeBuilder) {
-          if (type.formals != null) {
-            for (ParameterBuilder formal in type.formals!) {
-              if (usesTypeVariables(formal.type)) {
-                return true;
+          case FunctionTypeBuilder(
+              :List<ParameterBuilder>? formals,
+              :List<TypeVariableBuilder>? typeVariables
+            ):
+            if (formals != null) {
+              for (ParameterBuilder formal in formals) {
+                if (usesTypeVariables(formal.type)) {
+                  return true;
+                }
               }
             }
-          }
-          List<TypeVariableBuilder>? typeVariables = type.typeVariables;
-          if (typeVariables != null) {
-            for (TypeVariableBuilder variable in typeVariables) {
-              if (usesTypeVariables(variable.bound)) {
-                return true;
+            if (typeVariables != null) {
+              for (TypeVariableBuilder variable in typeVariables) {
+                if (usesTypeVariables(variable.bound)) {
+                  return true;
+                }
               }
             }
-          }
-          return usesTypeVariables(type.returnType);
-        } else if (type is RecordTypeBuilder) {
-          if (type.positionalFields != null) {
-            for (RecordTypeFieldBuilder fieldBuilder
-                in type.positionalFields!) {
-              if (usesTypeVariables(fieldBuilder.type)) {
-                return true;
+            return usesTypeVariables(type.returnType);
+          case RecordTypeBuilder(
+              :List<RecordTypeFieldBuilder>? positionalFields,
+              :List<RecordTypeFieldBuilder>? namedFields
+            ):
+            if (positionalFields != null) {
+              for (RecordTypeFieldBuilder fieldBuilder in positionalFields) {
+                if (usesTypeVariables(fieldBuilder.type)) {
+                  return true;
+                }
               }
             }
-          }
-          if (type.namedFields != null) {
-            for (RecordTypeFieldBuilder fieldBuilder in type.namedFields!) {
-              if (usesTypeVariables(fieldBuilder.type)) {
-                return true;
+            if (namedFields != null) {
+              for (RecordTypeFieldBuilder fieldBuilder in namedFields) {
+                if (usesTypeVariables(fieldBuilder.type)) {
+                  return true;
+                }
               }
             }
-          }
-        } else if (type is DependentTypeBuilder) {
-          return false;
-        } else if (type is FixedTypeBuilder) {
-          return false;
-        } else if (type is ImplicitTypeBuilder) {
-          return false;
-        } else if (type is InferableTypeBuilder) {
-          return false;
-        } else if (type is InvalidTypeBuilder) {
-          return false;
-        } else if (type is OmittedTypeBuilder) {
-          return false;
-        } else if (type == null) {
-          return false;
-        } else {
-          return unhandled(
-              "${type.runtimeType}",
-              "SourceLibraryBuilder._applyMixins.usesTypeVariables",
-              type.charOffset ?? TreeNode.noOffset,
-              type.fileUri ?? fileUri);
+          case FixedTypeBuilder():
+          case InvalidTypeBuilder():
+          case OmittedTypeBuilder():
+          case null:
+            return false;
         }
         return false;
       }
@@ -2689,7 +2680,7 @@
             applicationTypeArguments = <TypeBuilder>[];
             for (TypeVariableBuilder typeVariable in typeVariables) {
               applicationTypeArguments.add(
-                  new NamedTypeBuilder.fromTypeDeclarationBuilder(
+                  new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
                       // The type variable types passed as arguments to the
                       // generic class representing the anonymous mixin
                       // application should refer back to the type variables of
@@ -3224,7 +3215,7 @@
         TypeParameterScopeKind.extensionDeclaration) {
       // Make the synthesized return type invalid for extensions.
       String name = currentTypeParameterScopeBuilder.parent!.name;
-      returnType = new NamedTypeBuilder.forInvalidType(
+      returnType = new NamedTypeBuilderImpl.forInvalidType(
           currentTypeParameterScopeBuilder.parent!.name,
           const NullabilityBuilder.omitted(),
           messageExtensionDeclaresConstructor.withLocation(
@@ -3337,7 +3328,7 @@
     TypeParameterScopeBuilder savedDeclaration =
         currentTypeParameterScopeBuilder;
     currentTypeParameterScopeBuilder = factoryDeclaration;
-    if (returnType is NamedTypeBuilder && !typeVariables.isEmpty) {
+    if (returnType is NamedTypeBuilderImpl && !typeVariables.isEmpty) {
       returnType.arguments =
           new List<TypeBuilder>.generate(typeVariables.length, (int index) {
         return addNamedType(
@@ -3486,7 +3477,7 @@
       NullabilityBuilder nullabilityBuilder,
       Uri fileUri,
       int charOffset) {
-    FunctionTypeBuilder builder = new FunctionTypeBuilder(returnType,
+    FunctionTypeBuilder builder = new FunctionTypeBuilderImpl(returnType,
         typeVariables, formals, nullabilityBuilder, fileUri, charOffset);
     checkTypeVariables(typeVariables, null);
     if (typeVariables != null) {
@@ -3951,29 +3942,23 @@
     return copy;
   }
 
-  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
-    int count = 0;
-
+  /// Adds all [unboundTypeVariables] to [typeVariableBuilders], mapping them
+  /// to this library.
+  ///
+  /// This is used to compute the bounds of type variable while taking the
+  /// bound dependencies, which might span multiple libraries, into account.
+  void collectUnboundTypeVariables(
+      Map<TypeVariableBuilder, SourceLibraryBuilder> typeVariableBuilders) {
     Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
     if (patches != null) {
       for (SourceLibraryBuilder patchLibrary in patches) {
-        count += patchLibrary.finishTypeVariables(object, dynamicType);
+        patchLibrary.collectUnboundTypeVariables(typeVariableBuilders);
       }
     }
-
-    count += unboundTypeVariables.length;
-
-    // Ensure that type parameters are built after their dependencies by sorting
-    // them topologically using references in bounds.
-    for (TypeVariableBuilder builder
-        in _sortTypeVariablesTopologically(unboundTypeVariables)) {
-      builder.finish(this, object, dynamicType);
+    for (TypeVariableBuilder builder in unboundTypeVariables) {
+      typeVariableBuilders[builder] = this;
     }
     unboundTypeVariables.clear();
-
-    processPendingNullabilities();
-
-    return count;
   }
 
   /// Assigns nullabilities to types in [_pendingNullabilities].
@@ -3984,6 +3969,13 @@
   /// may be bounds to some of the type parameters of other types from the input
   /// list.
   void processPendingNullabilities() {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.processPendingNullabilities();
+      }
+    }
+
     // The bounds of type parameters may be type-parameter types of other
     // parameters from the same declaration.  In this case we need to set the
     // nullability for them first.  To preserve the ordering, we implement a
@@ -5750,78 +5742,6 @@
   }
 }
 
-List<TypeVariableBuilder> _sortTypeVariablesTopologically(
-    Iterable<TypeVariableBuilder> typeVariables) {
-  Set<TypeVariableBuilder> unhandled = new Set<TypeVariableBuilder>.identity()
-    ..addAll(typeVariables);
-  List<TypeVariableBuilder> result = <TypeVariableBuilder>[];
-  while (unhandled.isNotEmpty) {
-    TypeVariableBuilder rootVariable = unhandled.first;
-    unhandled.remove(rootVariable);
-    if (rootVariable.bound != null) {
-      _sortTypeVariablesTopologicallyFromRoot(
-          rootVariable.bound!, unhandled, result);
-    }
-    result.add(rootVariable);
-  }
-  return result;
-}
-
-void _sortTypeVariablesTopologicallyFromRoot(TypeBuilder root,
-    Set<TypeVariableBuilder> unhandled, List<TypeVariableBuilder> result) {
-  List<TypeVariableBuilder>? typeVariables;
-  List<TypeBuilder>? internalDependents;
-
-  if (root is NamedTypeBuilder) {
-    TypeDeclarationBuilder? declaration = root.declaration;
-    if (declaration is ClassBuilder) {
-      if (declaration.typeVariables != null &&
-          declaration.typeVariables!.isNotEmpty) {
-        typeVariables = declaration.typeVariables;
-      }
-    } else if (declaration is TypeAliasBuilder) {
-      if (declaration.typeVariables != null &&
-          declaration.typeVariables!.isNotEmpty) {
-        typeVariables = declaration.typeVariables;
-      }
-      internalDependents = <TypeBuilder>[declaration.type];
-    } else if (declaration is TypeVariableBuilder) {
-      typeVariables = <TypeVariableBuilder>[declaration];
-    }
-  } else if (root is FunctionTypeBuilder) {
-    if (root.typeVariables != null && root.typeVariables!.isNotEmpty) {
-      typeVariables = root.typeVariables;
-    }
-    if (root.formals != null && root.formals!.isNotEmpty) {
-      internalDependents = <TypeBuilder>[];
-      for (ParameterBuilder formal in root.formals!) {
-        internalDependents.add(formal.type);
-      }
-    }
-    if (root.returnType is! OmittedTypeBuilder) {
-      (internalDependents ??= <TypeBuilder>[]).add(root.returnType);
-    }
-  }
-
-  if (typeVariables != null && typeVariables.isNotEmpty) {
-    for (TypeVariableBuilder variable in typeVariables) {
-      if (unhandled.contains(variable)) {
-        unhandled.remove(variable);
-        if (variable.bound != null) {
-          _sortTypeVariablesTopologicallyFromRoot(
-              variable.bound!, unhandled, result);
-        }
-        result.add(variable);
-      }
-    }
-  }
-  if (internalDependents != null && internalDependents.isNotEmpty) {
-    for (TypeBuilder type in internalDependents) {
-      _sortTypeVariablesTopologicallyFromRoot(type, unhandled, result);
-    }
-  }
-}
-
 class PendingNullability {
   final Uri fileUri;
   final int charOffset;
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 5100d76..ccf6ceec 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -45,6 +45,7 @@
 import '../builder/class_builder.dart';
 import '../builder/extension_builder.dart';
 import '../builder/extension_type_declaration_builder.dart';
+import '../builder/inferable_type_builder.dart';
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
@@ -56,6 +57,7 @@
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
+import '../builder/type_variable_builder.dart';
 import '../builder_graph.dart';
 import '../denylisted_classes.dart'
     show denylistedCoreClasses, denylistedTypedDataClasses;
@@ -1842,11 +1844,27 @@
 
   void finishTypeVariables(Iterable<SourceLibraryBuilder> libraryBuilders,
       ClassBuilder object, TypeBuilder dynamicType) {
-    int count = 0;
+    Map<TypeVariableBuilder, SourceLibraryBuilder> unboundTypeVariableBuilders =
+        {};
     for (SourceLibraryBuilder library in libraryBuilders) {
-      count += library.finishTypeVariables(object, dynamicType);
+      library.collectUnboundTypeVariables(unboundTypeVariableBuilders);
     }
-    ticker.logMs("Resolved $count type-variable bounds");
+
+    // Ensure that type parameters are built after their dependencies by sorting
+    // them topologically using references in bounds.
+    List<TypeVariableBuilder> sortedTypeVariableBuilders =
+        sortTypeVariablesTopologically(unboundTypeVariableBuilders.keys);
+    for (TypeVariableBuilder builder in sortedTypeVariableBuilders) {
+      builder.finish(
+          unboundTypeVariableBuilders[builder]!, object, dynamicType);
+    }
+
+    for (SourceLibraryBuilder library in libraryBuilders) {
+      library.processPendingNullabilities();
+    }
+
+    ticker.logMs(
+        "Resolved ${sortedTypeVariableBuilders.length} type-variable bounds");
   }
 
   /// Computes variances of type parameters on typedefs in [libraryBuilders].
@@ -1973,7 +1991,7 @@
         cls.supertype = null;
         cls.mixedInType = null;
         classBuilder.supertypeBuilder =
-            new NamedTypeBuilder.fromTypeDeclarationBuilder(
+            new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
                 objectClass, const NullabilityBuilder.omitted(),
                 instanceTypeVariableAccess:
                     InstanceTypeVariableAccessState.Unexpected);
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 14068bd..443c699 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -7,7 +7,6 @@
 import '../fasta/builder/class_builder.dart';
 import '../fasta/builder/library_builder.dart';
 import '../fasta/builder/member_builder.dart';
-import '../fasta/builder/named_type_builder.dart';
 import '../fasta/builder/type_builder.dart';
 import '../fasta/builder/type_variable_builder.dart';
 import '../fasta/builder/extension_builder.dart';
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart b/pkg/front_end/testcases/general/bounds_type_parameters.dart
index 1e78739..32c9cfc 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart
@@ -10,6 +10,8 @@
 
 class G<X extends Class<X>> {}
 
+class H<X extends (Class<X>, int)> {}
+
 typedef Typedef1<
         T1 extends F, // Error
         T2 extends F<dynamic>, // Ok
@@ -26,7 +28,31 @@
         S5 extends G<ConcreteClass>, // Ok
         S6 extends G<Class<ConcreteClass>>, // Ok
         S7 extends G<Object>, // Error
-        S8 extends G<int> // Error
+        S8 extends G<int>, // Error
+        U1 extends (F, int), // Error
+        U2 extends (F<dynamic>, int), // Ok
+        U3 extends (F<Class>, int), // Ok
+        U4 extends (F<Class<dynamic>>, int), // Ok
+        U5 extends (F<ConcreteClass>, int), // Ok
+        U6 extends (F<Class<ConcreteClass>>, int), // Ok
+        U7 extends (F<Object>, int), // Error
+        U8 extends (F<int>, int), // Error
+        V1 extends ({G a, int b}), // Error
+        V2 extends ({G<dynamic> a, int b}), // Ok
+        V3 extends ({G<Class> a, int b}), // Ok
+        V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+        V5 extends ({G<ConcreteClass> a, int b}), // Ok
+        V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+        V7 extends ({G<Object> a, int b}), // Error
+        V8 extends ({G<int> a, int b}), // Error
+        W1 extends H, // Error
+        W2 extends H<dynamic>, // Ok
+        W3 extends H<(Class, int)>, // Ok
+        W4 extends H<(Class<dynamic>, int)>, // Ok
+        W5 extends H<(ConcreteClass, int)>, // Ok
+        W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+        W7 extends H<(Object, int)>, // Error
+        W8 extends H<(int, int)> // Error
         >
     = void Function();
 
@@ -46,7 +72,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     >();
 
 typedef void Typedef3<
@@ -65,7 +115,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     >();
 
 class Class1<
@@ -84,7 +158,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     > {}
 
 class Class2<
@@ -103,7 +201,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     > = Object with Class;
 
 mixin Mixin1<
@@ -122,7 +244,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     > {}
 
 // TODO(johnniwinther): Check/create this type as regular bounded i2b.
@@ -142,7 +288,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     > {
   a<
       ConcreteClass,
@@ -160,7 +330,31 @@
       G<ConcreteClass>,
       G<ConcreteClass>,
       G<ConcreteClass>,
-      G<ConcreteClass>>()
+      G<ConcreteClass>,
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int)>()
 }
 
 extension Extension<
@@ -179,7 +373,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     > on Class {}
 
 void method1<
@@ -198,7 +416,31 @@
     S5 extends G<ConcreteClass>, // Ok
     S6 extends G<Class<ConcreteClass>>, // Ok
     S7 extends G<Object>, // Error
-    S8 extends G<int> // Error
+    S8 extends G<int>, // Error
+    U1 extends (F, int), // Error
+    U2 extends (F<dynamic>, int), // Ok
+    U3 extends (F<Class>, int), // Ok
+    U4 extends (F<Class<dynamic>>, int), // Ok
+    U5 extends (F<ConcreteClass>, int), // Ok
+    U6 extends (F<Class<ConcreteClass>>, int), // Ok
+    U7 extends (F<Object>, int), // Error
+    U8 extends (F<int>, int), // Error
+    V1 extends ({G a, int b}), // Error
+    V2 extends ({G<dynamic> a, int b}), // Ok
+    V3 extends ({G<Class> a, int b}), // Ok
+    V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+    V5 extends ({G<ConcreteClass> a, int b}), // Ok
+    V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+    V7 extends ({G<Object> a, int b}), // Error
+    V8 extends ({G<int> a, int b}), // Error
+    W1 extends H, // Error
+    W2 extends H<dynamic>, // Ok
+    W3 extends H<(Class, int)>, // Ok
+    W4 extends H<(Class<dynamic>, int)>, // Ok
+    W5 extends H<(ConcreteClass, int)>, // Ok
+    W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+    W7 extends H<(Object, int)>, // Error
+    W8 extends H<(int, int)> // Error
     >() {}
 
 test() {
@@ -218,7 +460,31 @@
       S5 extends G<ConcreteClass>, // Ok
       S6 extends G<Class<ConcreteClass>>, // Ok
       S7 extends G<Object>, // Error
-      S8 extends G<int> // Error
+      S8 extends G<int>, // Error
+      U1 extends (F, int), // Error
+      U2 extends (F<dynamic>, int), // Ok
+      U3 extends (F<Class>, int), // Ok
+      U4 extends (F<Class<dynamic>>, int), // Ok
+      U5 extends (F<ConcreteClass>, int), // Ok
+      U6 extends (F<Class<ConcreteClass>>, int), // Ok
+      U7 extends (F<Object>, int), // Error
+      U8 extends (F<int>, int), // Error
+      V1 extends ({G a, int b}), // Error
+      V2 extends ({G<dynamic> a, int b}), // Ok
+      V3 extends ({G<Class> a, int b}), // Ok
+      V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+      V5 extends ({G<ConcreteClass> a, int b}), // Ok
+      V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+      V7 extends ({G<Object> a, int b}), // Error
+      V8 extends ({G<int> a, int b}), // Error
+      W1 extends H, // Error
+      W2 extends H<dynamic>, // Ok
+      W3 extends H<(Class, int)>, // Ok
+      W4 extends H<(Class<dynamic>, int)>, // Ok
+      W5 extends H<(ConcreteClass, int)>, // Ok
+      W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+      W7 extends H<(Object, int)>, // Error
+      W8 extends H<(int, int)> // Error
       >() {}
   void Function<
       T1 extends F, // Ok
@@ -236,7 +502,31 @@
       S5 extends G<ConcreteClass>, // Ok
       S6 extends G<Class<ConcreteClass>>, // Ok
       S7 extends G<Object>, // Error
-      S8 extends G<int> // Error
+      S8 extends G<int>, // Error
+      U1 extends (F, int), // Error
+      U2 extends (F<dynamic>, int), // Ok
+      U3 extends (F<Class>, int), // Ok
+      U4 extends (F<Class<dynamic>>, int), // Ok
+      U5 extends (F<ConcreteClass>, int), // Ok
+      U6 extends (F<Class<ConcreteClass>>, int), // Ok
+      U7 extends (F<Object>, int), // Error
+      U8 extends (F<int>, int), // Error
+      V1 extends ({G a, int b}), // Error
+      V2 extends ({G<dynamic> a, int b}), // Ok
+      V3 extends ({G<Class> a, int b}), // Ok
+      V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+      V5 extends ({G<ConcreteClass> a, int b}), // Ok
+      V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+      V7 extends ({G<Object> a, int b}), // Error
+      V8 extends ({G<int> a, int b}), // Error
+      W1 extends H, // Error
+      W2 extends H<dynamic>, // Ok
+      W3 extends H<(Class, int)>, // Ok
+      W4 extends H<(Class<dynamic>, int)>, // Ok
+      W5 extends H<(ConcreteClass, int)>, // Ok
+      W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+      W7 extends H<(Object, int)>, // Error
+      W8 extends H<(int, int)> // Error
       >() local;
 }
 
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.expect
index 9ebd198..058d079 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:14:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:16:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //         T1 extends F, // Error
 //         ^^
@@ -10,7 +10,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:24:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //         S1 extends G, // Error
 //         ^^
@@ -18,7 +18,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:34:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:32:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//         U1 extends (F, int), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//         V1 extends ({G a, int b}), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:9: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//         W1 extends H, // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -26,7 +50,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:42:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -34,7 +58,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:76:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:84:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:92:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:103:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -42,7 +90,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:61:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:111:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -50,7 +98,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:72:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:119:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:127:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:135:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:146:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -58,7 +130,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:80:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:154:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -66,7 +138,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:162:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:170:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:178:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:189:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -74,7 +170,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:197:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -82,7 +178,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:205:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:232:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -90,7 +210,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:240:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -98,7 +218,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:130:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:248:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:256:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:264:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:276:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -106,7 +250,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:138:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:284:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -114,7 +258,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:167:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:292:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:361:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -122,7 +290,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:175:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:369:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -130,7 +298,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:186:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:377:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:385:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:393:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:404:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -138,7 +330,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:194:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:412:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -146,7 +338,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:20:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:420:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:428:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:436:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -156,7 +372,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:21:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:23:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //         T8 extends F<int>, // Error
@@ -165,7 +381,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:28:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:30:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -175,16 +391,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:29:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:31:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//         S8 extends G<int> // Error
+//         S8 extends G<int>, // Error
 //                    ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:38:21: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U7 extends (F<Object>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:39:21: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U8 extends (F<int>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:46:22: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V7 extends ({G<Object> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:47:22: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V8 extends ({G<int> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:52:20: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W5 extends H<(ConcreteClass, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:20: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:54:20: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W7 extends H<(Object, int)>, // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:55:20: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W8 extends H<(int, int)> // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:66:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -194,7 +487,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:41:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -203,7 +496,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:74:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -213,16 +506,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:49:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:75:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:59:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:82:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:83:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:90:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:96:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:109:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -232,7 +602,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -241,7 +611,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -251,16 +621,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:78:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:126:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:133:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:134:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:139:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:140:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:141:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:142:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:152:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -270,7 +717,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:79:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:153:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -279,7 +726,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:86:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:160:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -289,16 +736,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:87:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:161:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:168:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:169:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:176:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:177:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:183:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:184:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:185:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:195:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -308,7 +832,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:196:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -317,7 +841,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:105:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:203:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -327,16 +851,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:106:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:204:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:116:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:211:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:219:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:225:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:226:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:227:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:228:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -346,7 +947,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -355,7 +956,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:124:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:246:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -365,16 +966,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:247:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:136:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:254:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:255:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:262:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:263:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:268:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:269:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:270:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:271:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:282:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -384,7 +1062,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -393,7 +1071,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:144:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:290:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -403,16 +1081,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:173:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:298:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:367:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -422,7 +1177,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:174:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:368:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -431,7 +1186,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:181:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:375:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -441,16 +1196,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:376:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:192:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:383:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:384:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:391:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:392:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:397:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:398:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:399:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:400:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:410:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -460,7 +1292,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:193:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:411:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -469,7 +1301,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:200:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:418:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -479,35 +1311,291 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:201:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:419:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:426:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:427:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:434:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:435:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:440:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:441:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:442:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:443:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:5: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:5: Context: This is the type variable whose bound isn't conformed to.
 //     T8 extends F<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:5: Context: This is the type variable whose bound isn't conformed to.
-//     S8 extends G<int> // Error
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:5: Context: This is the type variable whose bound isn't conformed to.
+//     S8 extends G<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(int, int)' of the type variable 'U8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:5: Context: This is the type variable whose bound isn't conformed to.
+//     U8 extends (F<int>, int), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Context: This is the type variable whose bound isn't conformed to.
+//     V1 extends ({G a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<dynamic> a, int b})' of the type variable 'V2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:301:5: Context: This is the type variable whose bound isn't conformed to.
+//     V2 extends ({G<dynamic> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:302:5: Context: This is the type variable whose bound isn't conformed to.
+//     V3 extends ({G<Class> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:303:5: Context: This is the type variable whose bound isn't conformed to.
+//     V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<ConcreteClass> a, int b})' of the type variable 'V5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:304:5: Context: This is the type variable whose bound isn't conformed to.
+//     V5 extends ({G<ConcreteClass> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<ConcreteClass>> a, int b})' of the type variable 'V6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:305:5: Context: This is the type variable whose bound isn't conformed to.
+//     V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Object> a, int b})' of the type variable 'V7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:5: Context: This is the type variable whose bound isn't conformed to.
+//     V7 extends ({G<Object> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<int> a, int b})' of the type variable 'V8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:5: Context: This is the type variable whose bound isn't conformed to.
+//     V8 extends ({G<int> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Context: This is the type variable whose bound isn't conformed to.
+//     W1 extends H, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<dynamic>' of the type variable 'W2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:309:5: Context: This is the type variable whose bound isn't conformed to.
+//     W2 extends H<dynamic>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:310:5: Context: This is the type variable whose bound isn't conformed to.
+//     W3 extends H<(Class, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:311:5: Context: This is the type variable whose bound isn't conformed to.
+//     W4 extends H<(Class<dynamic>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(ConcreteClass, int)>' of the type variable 'W5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:5: Context: This is the type variable whose bound isn't conformed to.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<ConcreteClass>, int)>' of the type variable 'W6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:5: Context: This is the type variable whose bound isn't conformed to.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Object, int)>' of the type variable 'W7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:5: Context: This is the type variable whose bound isn't conformed to.
+//     W7 extends H<(Object, int)>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(int, int)>' of the type variable 'W8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:5: Context: This is the type variable whose bound isn't conformed to.
+//     W8 extends H<(int, int)> // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:454:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -517,7 +1605,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:455:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -526,7 +1614,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:462:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -536,16 +1624,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:463:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:230:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:470:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:471:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:478:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:479:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:484:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:485:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:486:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:487:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:496:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -555,7 +1720,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:231:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:497:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -564,7 +1729,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:504:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -574,27 +1739,105 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:505:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Error: Constant evaluation error:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:512:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:513:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:520:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:521:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:526:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:527:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:528:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:529:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Error: Constant evaluation error:
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
 //  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Object' is from 'dart:core'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: While analyzing:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: While analyzing:
 // enum Enum1<
 //      ^
 //
@@ -602,9 +1845,9 @@
 import "dart:core" as core;
 
 typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
-typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
-typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void;
-typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
+typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
+typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void;
+typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
 abstract class Class<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
@@ -617,50 +1860,56 @@
     : super core::Object::•()
     ;
 }
-class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8>
+class H<X extends (self::Class<self::H::X>, core::int) = (self::Class<dynamic>, core::int)> extends core::Object {
+  synthetic constructor •() → self::H<self::H::X>
     : super core::Object::•()
     ;
 }
-class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
-  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8>
+class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8, self::Class1::U1, self::Class1::U2, self::Class1::U3, self::Class1::U4, self::Class1::U5, self::Class1::U6, self::Class1::U7, self::Class1::U8, self::Class1::V1, self::Class1::V2, self::Class1::V3, self::Class1::V4, self::Class1::V5, self::Class1::V6, self::Class1::V7, self::Class1::V8, self::Class1::W1, self::Class1::W2, self::Class1::W3, self::Class1::W4, self::Class1::W5, self::Class1::W6, self::Class1::W7, self::Class1::W8>
     : super core::Object::•()
     ;
 }
-abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8, self::Class2::U1, self::Class2::U2, self::Class2::U3, self::Class2::U4, self::Class2::U5, self::Class2::U6, self::Class2::U7, self::Class2::U8, self::Class2::V1, self::Class2::V2, self::Class2::V3, self::Class2::V4, self::Class2::V5, self::Class2::V6, self::Class2::V7, self::Class2::V8, self::Class2::W1, self::Class2::W2, self::Class2::W3, self::Class2::W4, self::Class2::W5, self::Class2::W6, self::Class2::W7, self::Class2::W8>
+    : super core::Object::•()
+    ;
 }
-class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
- - 'Object' is from 'dart:core'.";
-  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> a = #C3;
-  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8>
+ - 'Object' is from 'dart:core'.
+ - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.";
+  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> a = #C3;
+  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8, self::Enum1::U1, self::Enum1::U2, self::Enum1::U3, self::Enum1::U4, self::Enum1::U5, self::Enum1::U6, self::Enum1::U7, self::Enum1::U8, self::Enum1::V1, self::Enum1::V2, self::Enum1::V3, self::Enum1::V4, self::Enum1::V5, self::Enum1::V6, self::Enum1::V7, self::Enum1::V8, self::Enum1::W1, self::Enum1::W2, self::Enum1::W3, self::Enum1::W4, self::Enum1::W5, self::Enum1::W6, self::Enum1::W7, self::Enum1::W8>
     : super core::_Enum::•(#index, #name)
     ;
   method _enumToString() → core::String
     return "Enum1.${this.{core::_Enum::_name}{core::String}}";
 }
-extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> on self::Class<dynamic> {
+extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> on self::Class<dynamic> {
 }
-static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void {}
+static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void {}
 static method test() → dynamic {
-  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void {}
-  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void local;
+  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void {}
+  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void local;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = 0
   #C2 = "a"
-  #C3 = self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> {index:#C1, _name:#C2}
+  #C3 = self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> {index:#C1, _name:#C2}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///bounds_type_parameters.dart:
-- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:275:6)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.transformed.expect
index 95bcb2b..c8d14c6 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:14:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:16:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //         T1 extends F, // Error
 //         ^^
@@ -10,7 +10,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:24:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //         S1 extends G, // Error
 //         ^^
@@ -18,7 +18,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:34:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:32:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//         U1 extends (F, int), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//         V1 extends ({G a, int b}), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:9: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//         W1 extends H, // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -26,7 +50,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:42:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -34,7 +58,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:76:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:84:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:92:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:103:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -42,7 +90,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:61:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:111:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -50,7 +98,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:72:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:119:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:127:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:135:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:146:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -58,7 +130,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:80:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:154:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -66,7 +138,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:162:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:170:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:178:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:189:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -74,7 +170,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:197:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -82,7 +178,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:205:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:232:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -90,7 +210,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:240:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -98,7 +218,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:130:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:248:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:256:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:264:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:276:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -106,7 +250,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:138:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:284:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -114,7 +258,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:167:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:292:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:361:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -122,7 +290,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:175:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:369:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -130,7 +298,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:186:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:377:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:385:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:393:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:404:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -138,7 +330,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:194:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:412:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -146,7 +338,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:20:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:420:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:428:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:436:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -156,7 +372,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:21:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:23:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //         T8 extends F<int>, // Error
@@ -165,7 +381,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:28:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:30:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -175,16 +391,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:29:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:31:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//         S8 extends G<int> // Error
+//         S8 extends G<int>, // Error
 //                    ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:38:21: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U7 extends (F<Object>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:39:21: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U8 extends (F<int>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:46:22: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V7 extends ({G<Object> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:47:22: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V8 extends ({G<int> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:52:20: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W5 extends H<(ConcreteClass, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:20: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:54:20: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W7 extends H<(Object, int)>, // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:55:20: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W8 extends H<(int, int)> // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:66:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -194,7 +487,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:41:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -203,7 +496,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:74:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -213,16 +506,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:49:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:75:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:59:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:82:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:83:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:90:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:96:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:109:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -232,7 +602,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -241,7 +611,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -251,16 +621,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:78:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:126:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:133:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:134:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:139:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:140:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:141:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:142:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:152:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -270,7 +717,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:79:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:153:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -279,7 +726,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:86:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:160:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -289,16 +736,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:87:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:161:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:168:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:169:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:176:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:177:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:183:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:184:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:185:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:195:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -308,7 +832,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:196:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -317,7 +841,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:105:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:203:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -327,16 +851,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:106:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:204:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:116:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:211:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:219:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:225:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:226:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:227:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:228:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -346,7 +947,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -355,7 +956,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:124:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:246:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -365,16 +966,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:247:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:136:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:254:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:255:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:262:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:263:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:268:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:269:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:270:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:271:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:282:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -384,7 +1062,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -393,7 +1071,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:144:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:290:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -403,16 +1081,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:173:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:298:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:367:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -422,7 +1177,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:174:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:368:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -431,7 +1186,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:181:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:375:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -441,16 +1196,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:376:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:192:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:383:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:384:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:391:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:392:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:397:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:398:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:399:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:400:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:410:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -460,7 +1292,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:193:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:411:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -469,7 +1301,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:200:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:418:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -479,35 +1311,291 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:201:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:419:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:426:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:427:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:434:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:435:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:440:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:441:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:442:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:443:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:5: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:5: Context: This is the type variable whose bound isn't conformed to.
 //     T8 extends F<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:5: Context: This is the type variable whose bound isn't conformed to.
-//     S8 extends G<int> // Error
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:5: Context: This is the type variable whose bound isn't conformed to.
+//     S8 extends G<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(int, int)' of the type variable 'U8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:5: Context: This is the type variable whose bound isn't conformed to.
+//     U8 extends (F<int>, int), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Context: This is the type variable whose bound isn't conformed to.
+//     V1 extends ({G a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<dynamic> a, int b})' of the type variable 'V2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:301:5: Context: This is the type variable whose bound isn't conformed to.
+//     V2 extends ({G<dynamic> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:302:5: Context: This is the type variable whose bound isn't conformed to.
+//     V3 extends ({G<Class> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:303:5: Context: This is the type variable whose bound isn't conformed to.
+//     V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<ConcreteClass> a, int b})' of the type variable 'V5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:304:5: Context: This is the type variable whose bound isn't conformed to.
+//     V5 extends ({G<ConcreteClass> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<ConcreteClass>> a, int b})' of the type variable 'V6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:305:5: Context: This is the type variable whose bound isn't conformed to.
+//     V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Object> a, int b})' of the type variable 'V7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:5: Context: This is the type variable whose bound isn't conformed to.
+//     V7 extends ({G<Object> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<int> a, int b})' of the type variable 'V8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:5: Context: This is the type variable whose bound isn't conformed to.
+//     V8 extends ({G<int> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Context: This is the type variable whose bound isn't conformed to.
+//     W1 extends H, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<dynamic>' of the type variable 'W2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:309:5: Context: This is the type variable whose bound isn't conformed to.
+//     W2 extends H<dynamic>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:310:5: Context: This is the type variable whose bound isn't conformed to.
+//     W3 extends H<(Class, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:311:5: Context: This is the type variable whose bound isn't conformed to.
+//     W4 extends H<(Class<dynamic>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(ConcreteClass, int)>' of the type variable 'W5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:5: Context: This is the type variable whose bound isn't conformed to.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<ConcreteClass>, int)>' of the type variable 'W6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:5: Context: This is the type variable whose bound isn't conformed to.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Object, int)>' of the type variable 'W7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:5: Context: This is the type variable whose bound isn't conformed to.
+//     W7 extends H<(Object, int)>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(int, int)>' of the type variable 'W8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:5: Context: This is the type variable whose bound isn't conformed to.
+//     W8 extends H<(int, int)> // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:454:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -517,7 +1605,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:455:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -526,7 +1614,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:462:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -536,16 +1624,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:463:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:230:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:470:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:471:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:478:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:479:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:484:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:485:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:486:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:487:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:496:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -555,7 +1720,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:231:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:497:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -564,7 +1729,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:504:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -574,27 +1739,105 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:505:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Error: Constant evaluation error:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:512:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:513:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:520:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:521:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:526:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:527:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:528:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:529:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Error: Constant evaluation error:
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
 //  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Object' is from 'dart:core'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: While analyzing:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: While analyzing:
 // enum Enum1<
 //      ^
 //
@@ -602,9 +1845,9 @@
 import "dart:core" as core;
 
 typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
-typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
-typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void;
-typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
+typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
+typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void;
+typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
 abstract class Class<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
@@ -617,50 +1860,56 @@
     : super core::Object::•()
     ;
 }
-class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8>
+class H<X extends (self::Class<self::H::X>, core::int) = (self::Class<dynamic>, core::int)> extends core::Object {
+  synthetic constructor •() → self::H<self::H::X>
     : super core::Object::•()
     ;
 }
-class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object implements self::Class<dynamic> /*isEliminatedMixin,hasConstConstructor*/  {
-  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8>
+class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8, self::Class1::U1, self::Class1::U2, self::Class1::U3, self::Class1::U4, self::Class1::U5, self::Class1::U6, self::Class1::U7, self::Class1::U8, self::Class1::V1, self::Class1::V2, self::Class1::V3, self::Class1::V4, self::Class1::V5, self::Class1::V6, self::Class1::V7, self::Class1::V8, self::Class1::W1, self::Class1::W2, self::Class1::W3, self::Class1::W4, self::Class1::W5, self::Class1::W6, self::Class1::W7, self::Class1::W8>
     : super core::Object::•()
     ;
 }
-abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object implements self::Class<dynamic> /*isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8, self::Class2::U1, self::Class2::U2, self::Class2::U3, self::Class2::U4, self::Class2::U5, self::Class2::U6, self::Class2::U7, self::Class2::U8, self::Class2::V1, self::Class2::V2, self::Class2::V3, self::Class2::V4, self::Class2::V5, self::Class2::V6, self::Class2::V7, self::Class2::V8, self::Class2::W1, self::Class2::W2, self::Class2::W3, self::Class2::W4, self::Class2::W5, self::Class2::W6, self::Class2::W7, self::Class2::W8>
+    : super core::Object::•()
+    ;
 }
-class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
- - 'Object' is from 'dart:core'.";
-  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> a = #C3;
-  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8>
+ - 'Object' is from 'dart:core'.
+ - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.";
+  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> a = #C3;
+  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8, self::Enum1::U1, self::Enum1::U2, self::Enum1::U3, self::Enum1::U4, self::Enum1::U5, self::Enum1::U6, self::Enum1::U7, self::Enum1::U8, self::Enum1::V1, self::Enum1::V2, self::Enum1::V3, self::Enum1::V4, self::Enum1::V5, self::Enum1::V6, self::Enum1::V7, self::Enum1::V8, self::Enum1::W1, self::Enum1::W2, self::Enum1::W3, self::Enum1::W4, self::Enum1::W5, self::Enum1::W6, self::Enum1::W7, self::Enum1::W8>
     : super core::_Enum::•(#index, #name)
     ;
   method _enumToString() → core::String
     return "Enum1.${this.{core::_Enum::_name}{core::String}}";
 }
-extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> on self::Class<dynamic> {
+extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> on self::Class<dynamic> {
 }
-static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void {}
+static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void {}
 static method test() → dynamic {
-  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void {}
-  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void local;
+  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void {}
+  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void local;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = 0
   #C2 = "a"
-  #C3 = self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> {index:#C1, _name:#C2}
+  #C3 = self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> {index:#C1, _name:#C2}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///bounds_type_parameters.dart:
-- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:275:6)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline.expect
index 174bcbf..ad28b8a 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline.expect
@@ -6,6 +6,8 @@
 
 class G<X extends Class<X>> {}
 
+class H<X extends (Class<X>, int)> {}
+
 typedef Typedef1<
         T1 extends F,
         T2 extends F<dynamic>,
@@ -22,7 +24,31 @@
         S5 extends G<ConcreteClass>,
         S6 extends G<Class<ConcreteClass>>,
         S7 extends G<Object>,
-        S8 extends G<int>>
+        S8 extends G<int>,
+        U1 extends (F, int),
+        U2 extends (F<dynamic>, int),
+        U3 extends (F<Class>, int),
+        U4 extends (F<Class<dynamic>>, int),
+        U5 extends (F<ConcreteClass>, int),
+        U6 extends (F<Class<ConcreteClass>>, int),
+        U7 extends (F<Object>, int),
+        U8 extends (F<int>, int),
+        V1 extends ({G a, int b}),
+        V2 extends ({G<dynamic> a, int b}),
+        V3 extends ({G<Class> a, int b}),
+        V4 extends ({G<Class<dynamic>> a, int b}),
+        V5 extends ({G<ConcreteClass> a, int b}),
+        V6 extends ({G<Class<ConcreteClass>> a, int b}),
+        V7 extends ({G<Object> a, int b}),
+        V8 extends ({G<int> a, int b}),
+        W1 extends H,
+        W2 extends H<dynamic>,
+        W3 extends H<(Class, int)>,
+        W4 extends H<(Class<dynamic>, int)>,
+        W5 extends H<(ConcreteClass, int)>,
+        W6 extends H<(Class<ConcreteClass>, int)>,
+        W7 extends H<(Object, int)>,
+        W8 extends H<(int, int)>>
     = void Function();
 typedef Typedef2 = void Function<
     T1 extends F,
@@ -40,7 +66,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>>();
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>>();
 typedef void Typedef3<
     T1 extends F,
     T2 extends F<dynamic>,
@@ -57,7 +107,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>>();
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>>();
 
 class Class1<
     T1 extends F,
@@ -75,7 +149,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> {}
 
 class Class2<
     T1 extends F,
@@ -93,7 +191,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> = Object with Class;
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> = Object with Class;
 mixin Mixin1<
     T1 extends F,
     T2 extends F<dynamic>,
@@ -110,7 +232,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> {}
 
 enum Enum1<
     T1 extends F,
@@ -128,7 +274,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> {
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> {
   a<
       ConcreteClass,
       ConcreteClass,
@@ -145,7 +315,31 @@
       G<ConcreteClass>,
       G<ConcreteClass>,
       G<ConcreteClass>,
-      G<ConcreteClass>>()
+      G<ConcreteClass>,
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int)>()
 }
 
 extension Extension<
@@ -164,7 +358,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> on Class {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> on Class {}
 
 void method1<
     T1 extends F,
@@ -182,6 +400,30 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>>() {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>>() {}
 test() {}
 main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline_modelled.expect
index a925888..510c5c4 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline_modelled.expect
@@ -14,7 +14,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> {}
 
 class Class2<
     T1 extends F,
@@ -32,12 +56,38 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> = Object with Class;
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> = Object with Class;
 
 class ConcreteClass implements Class<ConcreteClass> {}
 
 class G<X extends Class<X>> {}
 
+class H<X extends (Class<X>, int)> {}
+
 enum Enum1<
     T1 extends F,
     T2 extends F<dynamic>,
@@ -54,7 +104,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> {
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> {
   a<
       ConcreteClass,
       ConcreteClass,
@@ -71,7 +145,31 @@
       G<ConcreteClass>,
       G<ConcreteClass>,
       G<ConcreteClass>,
-      G<ConcreteClass>>()
+      G<ConcreteClass>,
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      ({ConcreteClass a, int b}),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int),
+      (ConcreteClass, int)>()
 }
 
 extension Extension<
@@ -90,7 +188,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> on Class {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> on Class {}
 
 main() {}
 mixin Class<T> {}
@@ -110,7 +232,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>> {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>> {}
 test() {}
 typedef F<X extends Class<X>> = X;
 typedef Typedef1<
@@ -129,7 +275,31 @@
         S5 extends G<ConcreteClass>,
         S6 extends G<Class<ConcreteClass>>,
         S7 extends G<Object>,
-        S8 extends G<int>>
+        S8 extends G<int>,
+        U1 extends (F, int),
+        U2 extends (F<dynamic>, int),
+        U3 extends (F<Class>, int),
+        U4 extends (F<Class<dynamic>>, int),
+        U5 extends (F<ConcreteClass>, int),
+        U6 extends (F<Class<ConcreteClass>>, int),
+        U7 extends (F<Object>, int),
+        U8 extends (F<int>, int),
+        V1 extends ({G a, int b}),
+        V2 extends ({G<dynamic> a, int b}),
+        V3 extends ({G<Class> a, int b}),
+        V4 extends ({G<Class<dynamic>> a, int b}),
+        V5 extends ({G<ConcreteClass> a, int b}),
+        V6 extends ({G<Class<ConcreteClass>> a, int b}),
+        V7 extends ({G<Object> a, int b}),
+        V8 extends ({G<int> a, int b}),
+        W1 extends H,
+        W2 extends H<dynamic>,
+        W3 extends H<(Class, int)>,
+        W4 extends H<(Class<dynamic>, int)>,
+        W5 extends H<(ConcreteClass, int)>,
+        W6 extends H<(Class<ConcreteClass>, int)>,
+        W7 extends H<(Object, int)>,
+        W8 extends H<(int, int)>>
     = void Function();
 typedef Typedef2 = void Function<
     T1 extends F,
@@ -147,7 +317,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>>();
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>>();
 typedef void Typedef3<
     T1 extends F,
     T2 extends F<dynamic>,
@@ -164,7 +358,31 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>>();
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>>();
 void method1<
     T1 extends F,
     T2 extends F<dynamic>,
@@ -181,4 +399,28 @@
     S5 extends G<ConcreteClass>,
     S6 extends G<Class<ConcreteClass>>,
     S7 extends G<Object>,
-    S8 extends G<int>>() {}
+    S8 extends G<int>,
+    U1 extends (F, int),
+    U2 extends (F<dynamic>, int),
+    U3 extends (F<Class>, int),
+    U4 extends (F<Class<dynamic>>, int),
+    U5 extends (F<ConcreteClass>, int),
+    U6 extends (F<Class<ConcreteClass>>, int),
+    U7 extends (F<Object>, int),
+    U8 extends (F<int>, int),
+    V1 extends ({G a, int b}),
+    V2 extends ({G<dynamic> a, int b}),
+    V3 extends ({G<Class> a, int b}),
+    V4 extends ({G<Class<dynamic>> a, int b}),
+    V5 extends ({G<ConcreteClass> a, int b}),
+    V6 extends ({G<Class<ConcreteClass>> a, int b}),
+    V7 extends ({G<Object> a, int b}),
+    V8 extends ({G<int> a, int b}),
+    W1 extends H,
+    W2 extends H<dynamic>,
+    W3 extends H<(Class, int)>,
+    W4 extends H<(Class<dynamic>, int)>,
+    W5 extends H<(ConcreteClass, int)>,
+    W6 extends H<(Class<ConcreteClass>, int)>,
+    W7 extends H<(Object, int)>,
+    W8 extends H<(int, int)>>() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.expect
index dcc025f..fbe9d60 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:14:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:16:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //         T1 extends F, // Error
 //         ^^
@@ -10,7 +10,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:24:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //         S1 extends G, // Error
 //         ^^
@@ -18,7 +18,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:34:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:32:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//         U1 extends (F, int), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//         V1 extends ({G a, int b}), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:9: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//         W1 extends H, // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -26,7 +50,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:42:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -34,7 +58,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:76:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:84:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:92:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:103:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -42,7 +90,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:61:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:111:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -50,7 +98,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:72:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:119:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:127:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:135:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:146:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -58,7 +130,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:80:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:154:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -66,7 +138,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:162:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:170:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:178:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:189:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -74,7 +170,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:197:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -82,7 +178,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:205:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:232:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -90,7 +210,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:240:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -98,7 +218,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:130:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:248:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:256:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:264:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:276:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -106,7 +250,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:138:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:284:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -114,7 +258,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:167:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:292:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:361:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -122,7 +290,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:175:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:369:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -130,7 +298,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:186:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:377:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:385:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:393:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:404:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -138,7 +330,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:194:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:412:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -146,7 +338,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:20:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:420:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:428:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:436:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -156,7 +372,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:21:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:23:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //         T8 extends F<int>, // Error
@@ -165,7 +381,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:28:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:30:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -175,16 +391,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:29:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:31:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//         S8 extends G<int> // Error
+//         S8 extends G<int>, // Error
 //                    ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:38:21: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U7 extends (F<Object>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:39:21: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U8 extends (F<int>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:46:22: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V7 extends ({G<Object> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:47:22: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V8 extends ({G<int> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:52:20: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W5 extends H<(ConcreteClass, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:20: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:54:20: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W7 extends H<(Object, int)>, // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:55:20: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W8 extends H<(int, int)> // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:66:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -194,7 +487,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:41:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -203,7 +496,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:74:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -213,16 +506,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:49:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:75:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:59:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:82:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:83:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:90:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:96:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:109:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -232,7 +602,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -241,7 +611,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -251,16 +621,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:78:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:126:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:133:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:134:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:139:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:140:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:141:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:142:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:152:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -270,7 +717,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:79:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:153:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -279,7 +726,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:86:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:160:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -289,16 +736,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:87:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:161:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:168:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:169:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:176:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:177:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:183:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:184:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:185:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:195:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -308,7 +832,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:196:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -317,7 +841,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:105:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:203:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -327,16 +851,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:106:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:204:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:116:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:211:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:219:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:225:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:226:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:227:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:228:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -346,7 +947,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -355,7 +956,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:124:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:246:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -365,16 +966,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:247:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:136:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:254:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:255:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:262:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:263:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:268:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:269:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:270:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:271:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:282:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -384,7 +1062,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -393,7 +1071,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:144:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:290:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -403,16 +1081,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:173:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:298:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:367:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -422,7 +1177,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:174:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:368:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -431,7 +1186,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:181:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:375:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -441,16 +1196,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:376:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:192:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:383:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:384:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:391:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:392:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:397:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:398:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:399:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:400:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:410:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -460,7 +1292,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:193:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:411:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -469,7 +1301,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:200:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:418:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -479,35 +1311,291 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:201:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:419:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:426:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:427:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:434:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:435:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:440:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:441:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:442:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:443:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:5: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:5: Context: This is the type variable whose bound isn't conformed to.
 //     T8 extends F<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:5: Context: This is the type variable whose bound isn't conformed to.
-//     S8 extends G<int> // Error
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:5: Context: This is the type variable whose bound isn't conformed to.
+//     S8 extends G<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(int, int)' of the type variable 'U8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:5: Context: This is the type variable whose bound isn't conformed to.
+//     U8 extends (F<int>, int), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Context: This is the type variable whose bound isn't conformed to.
+//     V1 extends ({G a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<dynamic> a, int b})' of the type variable 'V2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:301:5: Context: This is the type variable whose bound isn't conformed to.
+//     V2 extends ({G<dynamic> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:302:5: Context: This is the type variable whose bound isn't conformed to.
+//     V3 extends ({G<Class> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:303:5: Context: This is the type variable whose bound isn't conformed to.
+//     V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<ConcreteClass> a, int b})' of the type variable 'V5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:304:5: Context: This is the type variable whose bound isn't conformed to.
+//     V5 extends ({G<ConcreteClass> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<ConcreteClass>> a, int b})' of the type variable 'V6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:305:5: Context: This is the type variable whose bound isn't conformed to.
+//     V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Object> a, int b})' of the type variable 'V7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:5: Context: This is the type variable whose bound isn't conformed to.
+//     V7 extends ({G<Object> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<int> a, int b})' of the type variable 'V8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:5: Context: This is the type variable whose bound isn't conformed to.
+//     V8 extends ({G<int> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Context: This is the type variable whose bound isn't conformed to.
+//     W1 extends H, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<dynamic>' of the type variable 'W2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:309:5: Context: This is the type variable whose bound isn't conformed to.
+//     W2 extends H<dynamic>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:310:5: Context: This is the type variable whose bound isn't conformed to.
+//     W3 extends H<(Class, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:311:5: Context: This is the type variable whose bound isn't conformed to.
+//     W4 extends H<(Class<dynamic>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(ConcreteClass, int)>' of the type variable 'W5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:5: Context: This is the type variable whose bound isn't conformed to.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<ConcreteClass>, int)>' of the type variable 'W6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:5: Context: This is the type variable whose bound isn't conformed to.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Object, int)>' of the type variable 'W7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:5: Context: This is the type variable whose bound isn't conformed to.
+//     W7 extends H<(Object, int)>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(int, int)>' of the type variable 'W8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:5: Context: This is the type variable whose bound isn't conformed to.
+//     W8 extends H<(int, int)> // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:454:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -517,7 +1605,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:455:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -526,7 +1614,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:462:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -536,16 +1624,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:463:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:230:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:470:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:471:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:478:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:479:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:484:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:485:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:486:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:487:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:496:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -555,7 +1720,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:231:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:497:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -564,7 +1729,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:504:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -574,27 +1739,105 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:505:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Error: Constant evaluation error:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:512:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:513:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:520:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:521:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:526:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:527:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:528:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:529:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Error: Constant evaluation error:
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
 //  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Object' is from 'dart:core'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: While analyzing:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: While analyzing:
 // enum Enum1<
 //      ^
 //
@@ -602,9 +1845,9 @@
 import "dart:core" as core;
 
 typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
-typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
-typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void;
-typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
+typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
+typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void;
+typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
 abstract class Class<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
@@ -617,50 +1860,56 @@
     : super core::Object::•()
     ;
 }
-class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8>
+class H<X extends (self::Class<self::H::X>, core::int) = (self::Class<dynamic>, core::int)> extends core::Object {
+  synthetic constructor •() → self::H<self::H::X>
     : super core::Object::•()
     ;
 }
-class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
-  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8>
+class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8, self::Class1::U1, self::Class1::U2, self::Class1::U3, self::Class1::U4, self::Class1::U5, self::Class1::U6, self::Class1::U7, self::Class1::U8, self::Class1::V1, self::Class1::V2, self::Class1::V3, self::Class1::V4, self::Class1::V5, self::Class1::V6, self::Class1::V7, self::Class1::V8, self::Class1::W1, self::Class1::W2, self::Class1::W3, self::Class1::W4, self::Class1::W5, self::Class1::W6, self::Class1::W7, self::Class1::W8>
     : super core::Object::•()
     ;
 }
-abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8, self::Class2::U1, self::Class2::U2, self::Class2::U3, self::Class2::U4, self::Class2::U5, self::Class2::U6, self::Class2::U7, self::Class2::U8, self::Class2::V1, self::Class2::V2, self::Class2::V3, self::Class2::V4, self::Class2::V5, self::Class2::V6, self::Class2::V7, self::Class2::V8, self::Class2::W1, self::Class2::W2, self::Class2::W3, self::Class2::W4, self::Class2::W5, self::Class2::W6, self::Class2::W7, self::Class2::W8>
+    : super core::Object::•()
+    ;
 }
-class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
- - 'Object' is from 'dart:core'.";
-  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> a = #C3;
-  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8>
+ - 'Object' is from 'dart:core'.
+ - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.";
+  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> a = #C3;
+  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8, self::Enum1::U1, self::Enum1::U2, self::Enum1::U3, self::Enum1::U4, self::Enum1::U5, self::Enum1::U6, self::Enum1::U7, self::Enum1::U8, self::Enum1::V1, self::Enum1::V2, self::Enum1::V3, self::Enum1::V4, self::Enum1::V5, self::Enum1::V6, self::Enum1::V7, self::Enum1::V8, self::Enum1::W1, self::Enum1::W2, self::Enum1::W3, self::Enum1::W4, self::Enum1::W5, self::Enum1::W6, self::Enum1::W7, self::Enum1::W8>
     : super core::_Enum::•(#index, #name)
     ;
   method _enumToString() → core::String
     return "Enum1.${this.{core::_Enum::_name}{core::String}}";
 }
-extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> on self::Class<dynamic> {
+extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> on self::Class<dynamic> {
 }
-static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void {}
+static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void {}
 static method test() → dynamic {
-  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void {}
-  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void local;
+  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void {}
+  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void local;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = 0
   #C2 = "a"
-  #C3 = self::Enum1<self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*> {index:#C1, _name:#C2}
+  #C3 = self::Enum1<self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*> {index:#C1, _name:#C2}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///bounds_type_parameters.dart:
-- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:275:6)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.modular.expect
index dcc025f..fbe9d60 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.modular.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:14:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:16:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //         T1 extends F, // Error
 //         ^^
@@ -10,7 +10,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:24:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //         S1 extends G, // Error
 //         ^^
@@ -18,7 +18,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:34:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:32:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//         U1 extends (F, int), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//         V1 extends ({G a, int b}), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:9: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//         W1 extends H, // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -26,7 +50,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:42:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -34,7 +58,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:76:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:84:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:92:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:103:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -42,7 +90,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:61:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:111:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -50,7 +98,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:72:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:119:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:127:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:135:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:146:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -58,7 +130,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:80:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:154:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -66,7 +138,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:162:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:170:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:178:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:189:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -74,7 +170,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:197:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -82,7 +178,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:205:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:232:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -90,7 +210,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:240:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -98,7 +218,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:130:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:248:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:256:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:264:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:276:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -106,7 +250,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:138:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:284:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -114,7 +258,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:167:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:292:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:361:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -122,7 +290,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:175:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:369:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -130,7 +298,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:186:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:377:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:385:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:393:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:404:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -138,7 +330,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:194:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:412:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -146,7 +338,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:20:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:420:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:428:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:436:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -156,7 +372,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:21:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:23:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //         T8 extends F<int>, // Error
@@ -165,7 +381,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:28:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:30:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -175,16 +391,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:29:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:31:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//         S8 extends G<int> // Error
+//         S8 extends G<int>, // Error
 //                    ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:38:21: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U7 extends (F<Object>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:39:21: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U8 extends (F<int>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:46:22: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V7 extends ({G<Object> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:47:22: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V8 extends ({G<int> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:52:20: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W5 extends H<(ConcreteClass, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:20: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:54:20: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W7 extends H<(Object, int)>, // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:55:20: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W8 extends H<(int, int)> // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:66:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -194,7 +487,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:41:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -203,7 +496,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:74:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -213,16 +506,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:49:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:75:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:59:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:82:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:83:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:90:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:96:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:109:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -232,7 +602,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -241,7 +611,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -251,16 +621,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:78:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:126:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:133:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:134:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:139:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:140:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:141:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:142:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:152:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -270,7 +717,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:79:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:153:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -279,7 +726,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:86:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:160:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -289,16 +736,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:87:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:161:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:168:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:169:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:176:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:177:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:183:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:184:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:185:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:195:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -308,7 +832,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:196:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -317,7 +841,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:105:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:203:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -327,16 +851,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:106:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:204:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:116:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:211:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:219:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:225:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:226:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:227:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:228:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -346,7 +947,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -355,7 +956,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:124:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:246:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -365,16 +966,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:247:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:136:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:254:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:255:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:262:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:263:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:268:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:269:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:270:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:271:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:282:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -384,7 +1062,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -393,7 +1071,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:144:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:290:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -403,16 +1081,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:173:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:298:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:367:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -422,7 +1177,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:174:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:368:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -431,7 +1186,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:181:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:375:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -441,16 +1196,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:376:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:192:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:383:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:384:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:391:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:392:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:397:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:398:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:399:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:400:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:410:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -460,7 +1292,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:193:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:411:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -469,7 +1301,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:200:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:418:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -479,35 +1311,291 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:201:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:419:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:426:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:427:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:434:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:435:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:440:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:441:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:442:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:443:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:5: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:5: Context: This is the type variable whose bound isn't conformed to.
 //     T8 extends F<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:5: Context: This is the type variable whose bound isn't conformed to.
-//     S8 extends G<int> // Error
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:5: Context: This is the type variable whose bound isn't conformed to.
+//     S8 extends G<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(int, int)' of the type variable 'U8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:5: Context: This is the type variable whose bound isn't conformed to.
+//     U8 extends (F<int>, int), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Context: This is the type variable whose bound isn't conformed to.
+//     V1 extends ({G a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<dynamic> a, int b})' of the type variable 'V2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:301:5: Context: This is the type variable whose bound isn't conformed to.
+//     V2 extends ({G<dynamic> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:302:5: Context: This is the type variable whose bound isn't conformed to.
+//     V3 extends ({G<Class> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:303:5: Context: This is the type variable whose bound isn't conformed to.
+//     V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<ConcreteClass> a, int b})' of the type variable 'V5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:304:5: Context: This is the type variable whose bound isn't conformed to.
+//     V5 extends ({G<ConcreteClass> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<ConcreteClass>> a, int b})' of the type variable 'V6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:305:5: Context: This is the type variable whose bound isn't conformed to.
+//     V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Object> a, int b})' of the type variable 'V7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:5: Context: This is the type variable whose bound isn't conformed to.
+//     V7 extends ({G<Object> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<int> a, int b})' of the type variable 'V8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:5: Context: This is the type variable whose bound isn't conformed to.
+//     V8 extends ({G<int> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Context: This is the type variable whose bound isn't conformed to.
+//     W1 extends H, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<dynamic>' of the type variable 'W2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:309:5: Context: This is the type variable whose bound isn't conformed to.
+//     W2 extends H<dynamic>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:310:5: Context: This is the type variable whose bound isn't conformed to.
+//     W3 extends H<(Class, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:311:5: Context: This is the type variable whose bound isn't conformed to.
+//     W4 extends H<(Class<dynamic>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(ConcreteClass, int)>' of the type variable 'W5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:5: Context: This is the type variable whose bound isn't conformed to.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<ConcreteClass>, int)>' of the type variable 'W6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:5: Context: This is the type variable whose bound isn't conformed to.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Object, int)>' of the type variable 'W7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:5: Context: This is the type variable whose bound isn't conformed to.
+//     W7 extends H<(Object, int)>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(int, int)>' of the type variable 'W8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:5: Context: This is the type variable whose bound isn't conformed to.
+//     W8 extends H<(int, int)> // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:454:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -517,7 +1605,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:455:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -526,7 +1614,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:462:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -536,16 +1624,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:463:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:230:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:470:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:471:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:478:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:479:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:484:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:485:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:486:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:487:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:496:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -555,7 +1720,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:231:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:497:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -564,7 +1729,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:504:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -574,27 +1739,105 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:505:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Error: Constant evaluation error:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:512:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:513:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:520:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:521:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:526:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:527:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:528:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:529:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Error: Constant evaluation error:
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
 //  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Object' is from 'dart:core'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: While analyzing:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: While analyzing:
 // enum Enum1<
 //      ^
 //
@@ -602,9 +1845,9 @@
 import "dart:core" as core;
 
 typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
-typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
-typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void;
-typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
+typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
+typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void;
+typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
 abstract class Class<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
@@ -617,50 +1860,56 @@
     : super core::Object::•()
     ;
 }
-class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8>
+class H<X extends (self::Class<self::H::X>, core::int) = (self::Class<dynamic>, core::int)> extends core::Object {
+  synthetic constructor •() → self::H<self::H::X>
     : super core::Object::•()
     ;
 }
-class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
-  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8>
+class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8, self::Class1::U1, self::Class1::U2, self::Class1::U3, self::Class1::U4, self::Class1::U5, self::Class1::U6, self::Class1::U7, self::Class1::U8, self::Class1::V1, self::Class1::V2, self::Class1::V3, self::Class1::V4, self::Class1::V5, self::Class1::V6, self::Class1::V7, self::Class1::V8, self::Class1::W1, self::Class1::W2, self::Class1::W3, self::Class1::W4, self::Class1::W5, self::Class1::W6, self::Class1::W7, self::Class1::W8>
     : super core::Object::•()
     ;
 }
-abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8, self::Class2::U1, self::Class2::U2, self::Class2::U3, self::Class2::U4, self::Class2::U5, self::Class2::U6, self::Class2::U7, self::Class2::U8, self::Class2::V1, self::Class2::V2, self::Class2::V3, self::Class2::V4, self::Class2::V5, self::Class2::V6, self::Class2::V7, self::Class2::V8, self::Class2::W1, self::Class2::W2, self::Class2::W3, self::Class2::W4, self::Class2::W5, self::Class2::W6, self::Class2::W7, self::Class2::W8>
+    : super core::Object::•()
+    ;
 }
-class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
- - 'Object' is from 'dart:core'.";
-  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> a = #C3;
-  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8>
+ - 'Object' is from 'dart:core'.
+ - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.";
+  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> a = #C3;
+  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8, self::Enum1::U1, self::Enum1::U2, self::Enum1::U3, self::Enum1::U4, self::Enum1::U5, self::Enum1::U6, self::Enum1::U7, self::Enum1::U8, self::Enum1::V1, self::Enum1::V2, self::Enum1::V3, self::Enum1::V4, self::Enum1::V5, self::Enum1::V6, self::Enum1::V7, self::Enum1::V8, self::Enum1::W1, self::Enum1::W2, self::Enum1::W3, self::Enum1::W4, self::Enum1::W5, self::Enum1::W6, self::Enum1::W7, self::Enum1::W8>
     : super core::_Enum::•(#index, #name)
     ;
   method _enumToString() → core::String
     return "Enum1.${this.{core::_Enum::_name}{core::String}}";
 }
-extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> on self::Class<dynamic> {
+extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> on self::Class<dynamic> {
 }
-static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void {}
+static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void {}
 static method test() → dynamic {
-  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void {}
-  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void local;
+  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void {}
+  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void local;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = 0
   #C2 = "a"
-  #C3 = self::Enum1<self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*> {index:#C1, _name:#C2}
+  #C3 = self::Enum1<self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*> {index:#C1, _name:#C2}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///bounds_type_parameters.dart:
-- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:275:6)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.outline.expect
index 5ce339c..5390c98 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:14:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:16:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //         T1 extends F, // Error
 //         ^^
@@ -10,7 +10,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:24:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //         S1 extends G, // Error
 //         ^^
@@ -18,7 +18,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:34:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:32:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//         U1 extends (F, int), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//         V1 extends ({G a, int b}), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:9: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//         W1 extends H, // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -26,7 +50,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:42:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -34,7 +58,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:76:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:84:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:92:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:103:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -42,7 +90,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:61:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:111:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -50,7 +98,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:72:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:119:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:127:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:135:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:146:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -58,7 +130,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:80:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:154:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -66,7 +138,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:162:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:170:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:178:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:189:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -74,7 +170,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:197:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -82,7 +178,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:205:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:232:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -90,7 +210,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:240:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -98,7 +218,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:130:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:248:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:256:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:264:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:276:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -106,7 +250,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:138:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:284:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -114,7 +258,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:167:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:292:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:361:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -122,7 +290,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:175:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:369:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -130,7 +298,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:186:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:377:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:385:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:393:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:404:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -138,7 +330,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:194:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:412:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -146,7 +338,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:20:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:420:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:428:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:436:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -156,7 +372,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:21:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:23:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //         T8 extends F<int>, // Error
@@ -165,7 +381,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:28:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:30:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -175,16 +391,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:29:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:31:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//         S8 extends G<int> // Error
+//         S8 extends G<int>, // Error
 //                    ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:38:21: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U7 extends (F<Object>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:39:21: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U8 extends (F<int>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:46:22: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V7 extends ({G<Object> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:47:22: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V8 extends ({G<int> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:52:20: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W5 extends H<(ConcreteClass, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:20: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:54:20: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W7 extends H<(Object, int)>, // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:55:20: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W8 extends H<(int, int)> // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:66:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -194,7 +487,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:41:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -203,7 +496,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:74:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -213,16 +506,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:49:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:75:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:59:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:82:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:83:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:90:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:96:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:109:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -232,7 +602,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -241,7 +611,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -251,16 +621,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:78:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:126:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:133:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:134:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:139:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:140:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:141:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:142:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:152:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -270,7 +717,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:79:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:153:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -279,7 +726,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:86:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:160:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -289,16 +736,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:87:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:161:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:168:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:169:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:176:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:177:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:183:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:184:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:185:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:195:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -308,7 +832,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:196:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -317,7 +841,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:105:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:203:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -327,16 +851,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:106:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:204:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:116:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:211:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:219:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:225:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:226:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:227:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:228:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -346,7 +947,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -355,7 +956,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:124:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:246:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -365,16 +966,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:247:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:136:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:254:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:255:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:262:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:263:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:268:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:269:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:270:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:271:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:282:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -384,7 +1062,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -393,7 +1071,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:144:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:290:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -403,16 +1081,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:173:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:298:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:367:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -422,7 +1177,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:174:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:368:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -431,7 +1186,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:181:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:375:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -441,16 +1196,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:376:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:192:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:383:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:384:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:391:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:392:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:397:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:398:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:399:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:400:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:410:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -460,7 +1292,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:193:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:411:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -469,7 +1301,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:200:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:418:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -479,41 +1311,297 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:201:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:419:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:426:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:427:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:434:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:435:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:440:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:441:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:442:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:443:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:5: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:5: Context: This is the type variable whose bound isn't conformed to.
 //     T8 extends F<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:5: Context: This is the type variable whose bound isn't conformed to.
-//     S8 extends G<int> // Error
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:5: Context: This is the type variable whose bound isn't conformed to.
+//     S8 extends G<int>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(int, int)' of the type variable 'U8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:5: Context: This is the type variable whose bound isn't conformed to.
+//     U8 extends (F<int>, int), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Context: This is the type variable whose bound isn't conformed to.
+//     V1 extends ({G a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<dynamic> a, int b})' of the type variable 'V2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:301:5: Context: This is the type variable whose bound isn't conformed to.
+//     V2 extends ({G<dynamic> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:302:5: Context: This is the type variable whose bound isn't conformed to.
+//     V3 extends ({G<Class> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:303:5: Context: This is the type variable whose bound isn't conformed to.
+//     V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<ConcreteClass> a, int b})' of the type variable 'V5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:304:5: Context: This is the type variable whose bound isn't conformed to.
+//     V5 extends ({G<ConcreteClass> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<ConcreteClass>> a, int b})' of the type variable 'V6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:305:5: Context: This is the type variable whose bound isn't conformed to.
+//     V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Object> a, int b})' of the type variable 'V7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:5: Context: This is the type variable whose bound isn't conformed to.
+//     V7 extends ({G<Object> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<int> a, int b})' of the type variable 'V8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:5: Context: This is the type variable whose bound isn't conformed to.
+//     V8 extends ({G<int> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Context: This is the type variable whose bound isn't conformed to.
+//     W1 extends H, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<dynamic>' of the type variable 'W2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:309:5: Context: This is the type variable whose bound isn't conformed to.
+//     W2 extends H<dynamic>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:310:5: Context: This is the type variable whose bound isn't conformed to.
+//     W3 extends H<(Class, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:311:5: Context: This is the type variable whose bound isn't conformed to.
+//     W4 extends H<(Class<dynamic>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(ConcreteClass, int)>' of the type variable 'W5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:5: Context: This is the type variable whose bound isn't conformed to.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<ConcreteClass>, int)>' of the type variable 'W6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:5: Context: This is the type variable whose bound isn't conformed to.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Object, int)>' of the type variable 'W7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:5: Context: This is the type variable whose bound isn't conformed to.
+//     W7 extends H<(Object, int)>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(int, int)>' of the type variable 'W8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:5: Context: This is the type variable whose bound isn't conformed to.
+//     W8 extends H<(int, int)> // Error
 //     ^
 //
 import self as self;
 import "dart:core" as core;
 
 typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
-typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
-typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void;
-typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
+typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
+typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void;
+typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
 abstract class Class<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
@@ -524,29 +1612,33 @@
   synthetic constructor •() → self::G<self::G::X>
     ;
 }
-class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8>
+class H<X extends (self::Class<self::H::X>, core::int) = (self::Class<dynamic>, core::int)> extends core::Object {
+  synthetic constructor •() → self::H<self::H::X>
     ;
 }
-class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
-  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8>
+class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8, self::Class1::U1, self::Class1::U2, self::Class1::U3, self::Class1::U4, self::Class1::U5, self::Class1::U6, self::Class1::U7, self::Class1::U8, self::Class1::V1, self::Class1::V2, self::Class1::V3, self::Class1::V4, self::Class1::V5, self::Class1::V6, self::Class1::V7, self::Class1::V8, self::Class1::W1, self::Class1::W2, self::Class1::W3, self::Class1::W4, self::Class1::W5, self::Class1::W6, self::Class1::W7, self::Class1::W8>
+    ;
+}
+class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> = core::Object with self::Class<dynamic> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8, self::Class2::U1, self::Class2::U2, self::Class2::U3, self::Class2::U4, self::Class2::U5, self::Class2::U6, self::Class2::U7, self::Class2::U8, self::Class2::V1, self::Class2::V2, self::Class2::V3, self::Class2::V4, self::Class2::V5, self::Class2::V6, self::Class2::V7, self::Class2::V8, self::Class2::W1, self::Class2::W2, self::Class2::W3, self::Class2::W4, self::Class2::W5, self::Class2::W6, self::Class2::W7, self::Class2::W8>
     : super core::Object::•()
     ;
 }
-abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
-class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = const <self::Enum1<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, dynamic, core::int, self::G<self::Class<dynamic>>, self::G<dynamic>, self::G<self::Class<dynamic>>, self::G<self::Class<dynamic>>, self::G<self::ConcreteClass>, self::G<self::Class<self::ConcreteClass>>, self::G<core::Object>, self::G<core::int>>>[self::Enum1::a];
-  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> a = const self::Enum1::•<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>>(0, "a");
-  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8>
+class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = const <self::Enum1<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, dynamic, core::int, self::G<self::Class<dynamic>>, self::G<dynamic>, self::G<self::Class<dynamic>>, self::G<self::Class<dynamic>>, self::G<self::ConcreteClass>, self::G<self::Class<self::ConcreteClass>>, self::G<core::Object>, self::G<core::int>, (self::Class<dynamic>, core::int), (dynamic, core::int), (self::Class<dynamic>, core::int), (self::Class<dynamic>, core::int), (self::ConcreteClass, core::int), (self::Class<self::ConcreteClass>, core::int), (core::Object, core::int), (core::int, core::int), ({required a: self::G<self::Class<dynamic>>, required b: core::int}), ({required a: self::G<dynamic>, required b: core::int}), ({required a: self::G<self::Class<dynamic>>, required b: core::int}), ({required a: self::G<self::Class<dynamic>>, required b: core::int}), ({required a: self::G<self::ConcreteClass>, required b: core::int}), ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), ({required a: self::G<core::Object>, required b: core::int}), ({required a: self::G<core::int>, required b: core::int}), self::H<(self::Class<dynamic>, core::int)>, self::H<dynamic>, self::H<(self::Class<dynamic>, core::int)>, self::H<(self::Class<dynamic>, core::int)>, self::H<(self::ConcreteClass, core::int)>, self::H<(self::Class<self::ConcreteClass>, core::int)>, self::H<(core::Object, core::int)>, self::H<(core::int, core::int)>>>[self::Enum1::a];
+  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> a = const self::Enum1::•<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)>(0, "a");
+  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8, self::Enum1::U1, self::Enum1::U2, self::Enum1::U3, self::Enum1::U4, self::Enum1::U5, self::Enum1::U6, self::Enum1::U7, self::Enum1::U8, self::Enum1::V1, self::Enum1::V2, self::Enum1::V3, self::Enum1::V4, self::Enum1::V5, self::Enum1::V6, self::Enum1::V7, self::Enum1::V8, self::Enum1::W1, self::Enum1::W2, self::Enum1::W3, self::Enum1::W4, self::Enum1::W5, self::Enum1::W6, self::Enum1::W7, self::Enum1::W8>
     : super core::_Enum::•(#index, #name)
     ;
   method _enumToString() → core::String
     return "Enum1.${this.{core::_Enum::_name}{core::String}}";
 }
-extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> on self::Class<dynamic> {
+extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> on self::Class<dynamic> {
 }
-static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void
+static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void
   ;
 static method test() → dynamic
   ;
@@ -555,6 +1647,6 @@
 
 
 Extra constant evaluation status:
-Evaluated: StaticGet @ org-dartlang-testcase:///bounds_type_parameters.dart:129:6 -> InstanceConstant(const Enum1<ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*>{_Enum.index: 0, _Enum._name: "a"})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_type_parameters.dart:147:3 -> InstanceConstant(const Enum1<ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*>{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: StaticGet @ org-dartlang-testcase:///bounds_type_parameters.dart:275:6 -> InstanceConstant(const Enum1<ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*)>{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_type_parameters.dart:317:3 -> InstanceConstant(const Enum1<ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, ConcreteClass*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, G<ConcreteClass*>*, (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), ({ConcreteClass* a, int* b}), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*), (ConcreteClass*, int*)>{_Enum.index: 0, _Enum._name: "a"})
 Extra constant evaluation: evaluated: 8, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.transformed.expect
index 80b9cf4..29250ba 100644
--- a/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:14:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:16:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //         T1 extends F, // Error
 //         ^^
@@ -10,7 +10,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:24:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //         S1 extends G, // Error
 //         ^^
@@ -18,7 +18,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:34:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:32:9: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//         U1 extends (F, int), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:9: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//         V1 extends ({G a, int b}), // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:9: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//         W1 extends H, // Error
+//         ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -26,7 +50,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:42:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -34,7 +58,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:76:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:84:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:92:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:103:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -42,7 +90,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:61:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:111:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -50,7 +98,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:72:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:119:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:127:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:135:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:146:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -58,7 +130,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:80:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:154:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -66,7 +138,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:162:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:170:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:178:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:189:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -74,7 +170,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:197:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -82,7 +178,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:205:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:232:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -90,7 +210,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:240:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -98,7 +218,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:130:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:248:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:256:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:264:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:276:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -106,7 +250,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:138:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:284:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -114,7 +258,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:167:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:292:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:361:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -122,7 +290,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:175:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:369:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -130,7 +298,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:186:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:377:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:385:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:393:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:404:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'F' here.
 //     T1 extends F, // Error
 //     ^^
@@ -138,7 +330,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:194:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:412:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
 // Try providing type arguments to 'G' here.
 //     S1 extends G, // Error
 //     ^^
@@ -146,7 +338,31 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:20:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:420:5: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+//     U1 extends (F, int), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:428:5: Error: Generic type 'G' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'G' here.
+//     V1 extends ({G a, int b}), // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:436:5: Error: Generic type 'H' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'H' here.
+//     W1 extends H, // Error
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:22:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -156,7 +372,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:21:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:23:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //         T8 extends F<int>, // Error
@@ -165,7 +381,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:28:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:30:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -175,16 +391,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:29:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:31:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//         S8 extends G<int> // Error
+//         S8 extends G<int>, // Error
 //                    ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:40:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:38:21: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U7 extends (F<Object>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:39:21: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         U8 extends (F<int>, int), // Error
+//                     ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:46:22: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V7 extends ({G<Object> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:47:22: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         V8 extends ({G<int> a, int b}), // Error
+//                      ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:52:20: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W5 extends H<(ConcreteClass, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:53:20: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:54:20: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W7 extends H<(Object, int)>, // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:55:20: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//         W8 extends H<(int, int)> // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:66:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -194,7 +487,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:41:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -203,7 +496,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:48:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:74:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -213,16 +506,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:49:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:75:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:59:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:82:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:83:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:90:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:91:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:96:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:99:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:109:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -232,7 +602,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:60:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:110:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -241,7 +611,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:67:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -251,16 +621,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:68:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:118:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:78:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:126:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:133:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:134:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:139:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:140:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:141:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:142:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:152:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -270,7 +717,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:79:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:153:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -279,7 +726,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:86:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:160:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -289,16 +736,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:87:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:161:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:97:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:168:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:169:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:176:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:177:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:183:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:184:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:185:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:195:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -308,7 +832,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:98:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:196:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -317,7 +841,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:105:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:203:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -327,16 +851,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:106:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:204:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:116:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:211:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:219:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:225:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:226:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:227:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:228:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -346,7 +947,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:117:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -355,7 +956,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:124:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:246:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -365,16 +966,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:125:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:247:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:136:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:254:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:255:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:262:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:263:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:268:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:269:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:270:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:271:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:282:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -384,7 +1062,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -393,7 +1071,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:144:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:290:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -403,16 +1081,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:173:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:298:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:367:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -422,7 +1177,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:174:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:368:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -431,7 +1186,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:181:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:375:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -441,16 +1196,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:182:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:376:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:192:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:383:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:384:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:391:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:392:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:397:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:398:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:399:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:400:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:410:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -460,7 +1292,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:193:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:411:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     T8 extends F<int>, // Error
@@ -469,7 +1301,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:200:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:418:16: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -479,35 +1311,291 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:201:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:419:16: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//     S8 extends G<int> // Error
+//     S8 extends G<int>, // Error
 //                ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:426:17: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U7 extends (F<Object>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:427:17: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     U8 extends (F<int>, int), // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:434:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V7 extends ({G<Object> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:435:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     V8 extends ({G<int> a, int b}), // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:440:16: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:441:16: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:442:16: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W7 extends H<(Object, int)>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:443:16: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     W8 extends H<(int, int)> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'ConcreteClass' doesn't conform to the bound 'int' of the type variable 'T8' on 'Enum1'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:137:5: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:283:5: Context: This is the type variable whose bound isn't conformed to.
 //     T8 extends F<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:147:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument 'G<ConcreteClass>' doesn't conform to the bound 'G<int>' of the type variable 'S8' on 'Enum1'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   a<
 //   ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:145:5: Context: This is the type variable whose bound isn't conformed to.
-//     S8 extends G<int> // Error
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:291:5: Context: This is the type variable whose bound isn't conformed to.
+//     S8 extends G<int>, // Error
 //     ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:212:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(int, int)' of the type variable 'U8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:299:5: Context: This is the type variable whose bound isn't conformed to.
+//     U8 extends (F<int>, int), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:300:5: Context: This is the type variable whose bound isn't conformed to.
+//     V1 extends ({G a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<dynamic> a, int b})' of the type variable 'V2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:301:5: Context: This is the type variable whose bound isn't conformed to.
+//     V2 extends ({G<dynamic> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:302:5: Context: This is the type variable whose bound isn't conformed to.
+//     V3 extends ({G<Class> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<dynamic>> a, int b})' of the type variable 'V4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:303:5: Context: This is the type variable whose bound isn't conformed to.
+//     V4 extends ({G<Class<dynamic>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<ConcreteClass> a, int b})' of the type variable 'V5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:304:5: Context: This is the type variable whose bound isn't conformed to.
+//     V5 extends ({G<ConcreteClass> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Class<ConcreteClass>> a, int b})' of the type variable 'V6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:305:5: Context: This is the type variable whose bound isn't conformed to.
+//     V6 extends ({G<Class<ConcreteClass>> a, int b}), // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<Object> a, int b})' of the type variable 'V7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:306:5: Context: This is the type variable whose bound isn't conformed to.
+//     V7 extends ({G<Object> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '({ConcreteClass a, int b})' doesn't conform to the bound '({G<int> a, int b})' of the type variable 'V8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:307:5: Context: This is the type variable whose bound isn't conformed to.
+//     V8 extends ({G<int> a, int b}), // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W1' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:308:5: Context: This is the type variable whose bound isn't conformed to.
+//     W1 extends H, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<dynamic>' of the type variable 'W2' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:309:5: Context: This is the type variable whose bound isn't conformed to.
+//     W2 extends H<dynamic>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W3' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:310:5: Context: This is the type variable whose bound isn't conformed to.
+//     W3 extends H<(Class, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<dynamic>, int)>' of the type variable 'W4' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:311:5: Context: This is the type variable whose bound isn't conformed to.
+//     W4 extends H<(Class<dynamic>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(ConcreteClass, int)>' of the type variable 'W5' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:312:5: Context: This is the type variable whose bound isn't conformed to.
+//     W5 extends H<(ConcreteClass, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Class<ConcreteClass>, int)>' of the type variable 'W6' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:313:5: Context: This is the type variable whose bound isn't conformed to.
+//     W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(Object, int)>' of the type variable 'W7' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:314:5: Context: This is the type variable whose bound isn't conformed to.
+//     W7 extends H<(Object, int)>, // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:317:3: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound 'H<(int, int)>' of the type variable 'W8' on 'Enum1'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   a<
+//   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:315:5: Context: This is the type variable whose bound isn't conformed to.
+//     W8 extends H<(int, int)> // Error
+//     ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:454:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -517,7 +1605,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:213:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:455:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -526,7 +1614,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:220:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:462:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -536,16 +1624,93 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:221:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:463:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:230:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:470:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:471:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:478:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:479:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:484:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:485:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:486:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:487:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:496:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -555,7 +1720,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:231:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:497:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //       T8 extends F<int>, // Error
@@ -564,7 +1729,7 @@
 // typedef F<X extends Class<X>> = X;
 //           ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:238:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:504:18: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
@@ -574,27 +1739,105 @@
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:239:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:505:18: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//       S8 extends G<int> // Error
+//       S8 extends G<int>, // Error
 //                  ^
 // pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
 // class G<X extends Class<X>> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Error: Constant evaluation error:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:512:19: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U7 extends (F<Object>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:513:19: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       U8 extends (F<int>, int), // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = X;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:520:20: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V7 extends ({G<Object> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:521:20: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       V8 extends ({G<int> a, int b}), // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:526:18: Error: Type argument '(ConcreteClass, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W5 extends H<(ConcreteClass, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:527:18: Error: Type argument '(Class<ConcreteClass>, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+//  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W6 extends H<(Class<ConcreteClass>, int)>, // Ok
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:528:18: Error: Type argument '(Object, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W7 extends H<(Object, int)>, // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:529:18: Error: Type argument '(int, int)' doesn't conform to the bound '(Class<X>, int)' of the type variable 'X' on 'H'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       W8 extends H<(int, int)> // Error
+//                  ^
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class H<X extends (Class<X>, int)> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Error: Constant evaluation error:
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
 //  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 //  - 'Object' is from 'dart:core'.
+//  - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
 // enum Enum1<
 //      ^
-// pkg/front_end/testcases/general/bounds_type_parameters.dart:129:6: Context: While analyzing:
+// pkg/front_end/testcases/general/bounds_type_parameters.dart:275:6: Context: While analyzing:
 // enum Enum1<
 //      ^
 //
@@ -602,9 +1845,9 @@
 import "dart:core" as core;
 
 typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
-typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
-typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void;
-typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic> = () → void;
+typedef Typedef1<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
+typedef Typedef2 = <T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void;
+typedef Typedef3<unrelated T1 extends self::Class<dynamic> = dynamic, unrelated T2 extends dynamic, unrelated T3 extends self::Class<dynamic> = dynamic, unrelated T4 extends self::Class<dynamic> = dynamic, unrelated T5 extends self::ConcreteClass = dynamic, unrelated T6 extends self::Class<self::ConcreteClass> = dynamic, unrelated T7 extends core::Object = dynamic, unrelated T8 extends core::int = dynamic, unrelated S1 extends self::G<self::Class<dynamic>> = dynamic, unrelated S2 extends self::G<dynamic> = dynamic, unrelated S3 extends self::G<self::Class<dynamic>> = dynamic, unrelated S4 extends self::G<self::Class<dynamic>> = dynamic, unrelated S5 extends self::G<self::ConcreteClass> = dynamic, unrelated S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, unrelated S7 extends self::G<core::Object> = dynamic, unrelated S8 extends self::G<core::int> = dynamic, unrelated U1 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U2 extends (dynamic, core::int) = dynamic, unrelated U3 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U4 extends (self::Class<dynamic>, core::int) = dynamic, unrelated U5 extends (self::ConcreteClass, core::int) = dynamic, unrelated U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, unrelated U7 extends (core::Object, core::int) = dynamic, unrelated U8 extends (core::int, core::int) = dynamic, unrelated V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, unrelated V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, unrelated V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, unrelated V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, unrelated V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, unrelated V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, unrelated W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W2 extends self::H<dynamic> = dynamic, unrelated W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, unrelated W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, unrelated W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, unrelated W7 extends self::H<(core::Object, core::int)> = dynamic, unrelated W8 extends self::H<(core::int, core::int)> = dynamic> = () → void;
 abstract class Class<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
 }
 class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
@@ -617,50 +1860,56 @@
     : super core::Object::•()
     ;
 }
-class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8>
+class H<X extends (self::Class<self::H::X>, core::int) = (self::Class<dynamic>, core::int)> extends core::Object {
+  synthetic constructor •() → self::H<self::H::X>
     : super core::Object::•()
     ;
 }
-class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object implements self::Class<dynamic> /*isEliminatedMixin,hasConstConstructor*/  {
-  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8>
+class Class1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T1, self::Class1::T2%, self::Class1::T3, self::Class1::T4, self::Class1::T5, self::Class1::T6, self::Class1::T7, self::Class1::T8, self::Class1::S1, self::Class1::S2, self::Class1::S3, self::Class1::S4, self::Class1::S5, self::Class1::S6, self::Class1::S7, self::Class1::S8, self::Class1::U1, self::Class1::U2, self::Class1::U3, self::Class1::U4, self::Class1::U5, self::Class1::U6, self::Class1::U7, self::Class1::U8, self::Class1::V1, self::Class1::V2, self::Class1::V3, self::Class1::V4, self::Class1::V5, self::Class1::V6, self::Class1::V7, self::Class1::V8, self::Class1::W1, self::Class1::W2, self::Class1::W3, self::Class1::W4, self::Class1::W5, self::Class1::W6, self::Class1::W7, self::Class1::W8>
     : super core::Object::•()
     ;
 }
-abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+class Class2<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object implements self::Class<dynamic> /*isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::Class2<self::Class2::T1, self::Class2::T2%, self::Class2::T3, self::Class2::T4, self::Class2::T5, self::Class2::T6, self::Class2::T7, self::Class2::T8, self::Class2::S1, self::Class2::S2, self::Class2::S3, self::Class2::S4, self::Class2::S5, self::Class2::S6, self::Class2::S7, self::Class2::S8, self::Class2::U1, self::Class2::U2, self::Class2::U3, self::Class2::U4, self::Class2::U5, self::Class2::U6, self::Class2::U7, self::Class2::U8, self::Class2::V1, self::Class2::V2, self::Class2::V3, self::Class2::V4, self::Class2::V5, self::Class2::V6, self::Class2::V7, self::Class2::V8, self::Class2::W1, self::Class2::W2, self::Class2::W3, self::Class2::W4, self::Class2::W5, self::Class2::W6, self::Class2::W7, self::Class2::W8>
+    : super core::Object::•()
+    ;
 }
-class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> extends core::_Enum /*isEnum*/  {
-  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>>'.
+abstract class Mixin1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class Enum1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>> values = invalid-expression "Expected constant 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)> {}' to be of type 'Enum1<Class<dynamic>, dynamic, Class<dynamic>, Class<dynamic>, ConcreteClass, Class<ConcreteClass>, dynamic, int, G<Class<dynamic>>, G<dynamic>, G<Class<dynamic>>, G<Class<dynamic>>, G<ConcreteClass>, G<Class<ConcreteClass>>, G<Object>, G<int>, (Class<dynamic>, int), (dynamic, int), (Class<dynamic>, int), (Class<dynamic>, int), (ConcreteClass, int), (Class<ConcreteClass>, int), (Object, int), (int, int), ({G<Class<dynamic>> a, int b}), ({G<dynamic> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<Class<dynamic>> a, int b}), ({G<ConcreteClass> a, int b}), ({G<Class<ConcreteClass>> a, int b}), ({G<Object> a, int b}), ({G<int> a, int b}), H<(Class<dynamic>, int)>, H<dynamic>, H<(Class<dynamic>, int)>, H<(Class<dynamic>, int)>, H<(ConcreteClass, int)>, H<(Class<ConcreteClass>, int)>, H<(Object, int)>, H<(int, int)>>', but was of type 'Enum1<ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, ConcreteClass, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, G<ConcreteClass>, (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), ({ConcreteClass a, int b}), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int), (ConcreteClass, int)>'.
  - 'Enum1' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'ConcreteClass' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'G' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
- - 'Object' is from 'dart:core'.";
-  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>> a = #C3;
-  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8>
+ - 'Object' is from 'dart:core'.
+ - 'H' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.";
+  enum-element static const field self::Enum1<self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::ConcreteClass, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, self::G<self::ConcreteClass>, (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), ({required a: self::ConcreteClass, required b: core::int}), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int), (self::ConcreteClass, core::int)> a = #C3;
+  const constructor •(core::int #index, core::String #name) → self::Enum1<self::Enum1::T1, self::Enum1::T2%, self::Enum1::T3, self::Enum1::T4, self::Enum1::T5, self::Enum1::T6, self::Enum1::T7, self::Enum1::T8, self::Enum1::S1, self::Enum1::S2, self::Enum1::S3, self::Enum1::S4, self::Enum1::S5, self::Enum1::S6, self::Enum1::S7, self::Enum1::S8, self::Enum1::U1, self::Enum1::U2, self::Enum1::U3, self::Enum1::U4, self::Enum1::U5, self::Enum1::U6, self::Enum1::U7, self::Enum1::U8, self::Enum1::V1, self::Enum1::V2, self::Enum1::V3, self::Enum1::V4, self::Enum1::V5, self::Enum1::V6, self::Enum1::V7, self::Enum1::V8, self::Enum1::W1, self::Enum1::W2, self::Enum1::W3, self::Enum1::W4, self::Enum1::W5, self::Enum1::W6, self::Enum1::W7, self::Enum1::W8>
     : super core::_Enum::•(#index, #name)
     ;
   method _enumToString() → core::String
     return "Enum1.${this.{core::_Enum::_name}{core::String}}";
 }
-extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic> on self::Class<dynamic> {
+extension Extension<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic> on self::Class<dynamic> {
 }
-static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic>() → void {}
+static method method1<T1 extends self::Class<dynamic> = dynamic, T2 extends dynamic, T3 extends self::Class<dynamic> = dynamic, T4 extends self::Class<dynamic> = dynamic, T5 extends self::ConcreteClass = dynamic, T6 extends self::Class<self::ConcreteClass> = dynamic, T7 extends core::Object = dynamic, T8 extends core::int = dynamic, S1 extends self::G<self::Class<dynamic>> = dynamic, S2 extends self::G<dynamic> = dynamic, S3 extends self::G<self::Class<dynamic>> = dynamic, S4 extends self::G<self::Class<dynamic>> = dynamic, S5 extends self::G<self::ConcreteClass> = dynamic, S6 extends self::G<self::Class<self::ConcreteClass>> = dynamic, S7 extends self::G<core::Object> = dynamic, S8 extends self::G<core::int> = dynamic, U1 extends (self::Class<dynamic>, core::int) = dynamic, U2 extends (dynamic, core::int) = dynamic, U3 extends (self::Class<dynamic>, core::int) = dynamic, U4 extends (self::Class<dynamic>, core::int) = dynamic, U5 extends (self::ConcreteClass, core::int) = dynamic, U6 extends (self::Class<self::ConcreteClass>, core::int) = dynamic, U7 extends (core::Object, core::int) = dynamic, U8 extends (core::int, core::int) = dynamic, V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V2 extends ({required a: self::G<dynamic>, required b: core::int}) = dynamic, V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}) = dynamic, V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}) = dynamic, V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}) = dynamic, V7 extends ({required a: self::G<core::Object>, required b: core::int}) = dynamic, V8 extends ({required a: self::G<core::int>, required b: core::int}) = dynamic, W1 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W2 extends self::H<dynamic> = dynamic, W3 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W4 extends self::H<(self::Class<dynamic>, core::int)> = dynamic, W5 extends self::H<(self::ConcreteClass, core::int)> = dynamic, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)> = dynamic, W7 extends self::H<(core::Object, core::int)> = dynamic, W8 extends self::H<(core::int, core::int)> = dynamic>() → void {}
 static method test() → dynamic {
-  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void {}
-  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>>() → void local;
+  function local1<T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void {}
+  <T1 extends self::Class<dynamic>, T2 extends dynamic, T3 extends self::Class<dynamic>, T4 extends self::Class<dynamic>, T5 extends self::ConcreteClass, T6 extends self::Class<self::ConcreteClass>, T7 extends core::Object, T8 extends core::int, S1 extends self::G<self::Class<dynamic>>, S2 extends self::G<dynamic>, S3 extends self::G<self::Class<dynamic>>, S4 extends self::G<self::Class<dynamic>>, S5 extends self::G<self::ConcreteClass>, S6 extends self::G<self::Class<self::ConcreteClass>>, S7 extends self::G<core::Object>, S8 extends self::G<core::int>, U1 extends (self::Class<dynamic>, core::int), U2 extends (dynamic, core::int), U3 extends (self::Class<dynamic>, core::int), U4 extends (self::Class<dynamic>, core::int), U5 extends (self::ConcreteClass, core::int), U6 extends (self::Class<self::ConcreteClass>, core::int), U7 extends (core::Object, core::int), U8 extends (core::int, core::int), V1 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V2 extends ({required a: self::G<dynamic>, required b: core::int}), V3 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V4 extends ({required a: self::G<self::Class<dynamic>>, required b: core::int}), V5 extends ({required a: self::G<self::ConcreteClass>, required b: core::int}), V6 extends ({required a: self::G<self::Class<self::ConcreteClass>>, required b: core::int}), V7 extends ({required a: self::G<core::Object>, required b: core::int}), V8 extends ({required a: self::G<core::int>, required b: core::int}), W1 extends self::H<(self::Class<dynamic>, core::int)>, W2 extends self::H<dynamic>, W3 extends self::H<(self::Class<dynamic>, core::int)>, W4 extends self::H<(self::Class<dynamic>, core::int)>, W5 extends self::H<(self::ConcreteClass, core::int)>, W6 extends self::H<(self::Class<self::ConcreteClass>, core::int)>, W7 extends self::H<(core::Object, core::int)>, W8 extends self::H<(core::int, core::int)>>() → void local;
 }
 static method main() → dynamic {}
 
 constants  {
   #C1 = 0
   #C2 = "a"
-  #C3 = self::Enum1<self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*> {index:#C1, _name:#C2}
+  #C3 = self::Enum1<self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::ConcreteClass*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, self::G<self::ConcreteClass*>*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, ({required a: self::ConcreteClass*, required b: core::int*})*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*, (self::ConcreteClass*, core::int*)*> {index:#C1, _name:#C2}
 }
 
 
 Constructor coverage from constants:
 org-dartlang-testcase:///bounds_type_parameters.dart:
-- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:275:6)
 - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart b/pkg/front_end/testcases/general/type_variable_uses.dart
index 2bdaa6d..9c0759e 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart
@@ -5,28 +5,46 @@
 class C<T> {
   const C();
   static C<T> staticMethod() {
-    print(T);
-    T t;
-    C<T> l;
-    C<C<T>> ll;
-    const C<T>();
-    const <T>[];
-    const <C<T>>[];
-    const <Object>[T];
-    const <Object>[const C<T>()];
+    print(T); // Error
+    T t; // Error
+    C<T> l; // Error
+    C<C<T>> ll; // Error
+    <(T, int)>[]; // Error
+    <({T a, int b})>[]; // Error
+    <void Function<S extends T>()>[]; // Error
+    const C<T>(); // Error
+    const <T>[]; // Error
+    const <C<T>>[]; // Error
+    const <Object>[T]; // Error
+    const <Object>[const C<T>()]; // Error
+    const <(T, int)>[]; // Error
+    const <({T a, int b})>[]; // Error
+    const <void Function<S extends T>()>[]; // Error
+    const C<(T, int)>(); // Error
+    const C<({T a, int b})>(); // Error
+    const C<void Function<S extends T>()>(); // Error
     throw '';
   }
 
   C<T> instanceMethod() {
-    print(T);
-    T t;
-    C<T> l;
-    C<C<T>> ll;
-    const C<T>();
-    const <T>[];
-    const <C<T>>[];
-    const <Object>[T];
-    const <Object>[const C<T>()];
+    print(T); // Ok
+    T t; // Ok
+    C<T> l; // Ok
+    C<C<T>> ll; // Ok
+    <(T, int)>[]; // Error
+    <({T a, int b})>[]; // Error
+    <void Function<S extends T>()>[]; // Error
+    const C<T>(); // Error
+    const <T>[]; // Error
+    const <C<T>>[]; // Error
+    const <Object>[T]; // Error
+    const <Object>[const C<T>()]; // Error
+    const <(T, int)>[]; // Error
+    const <({T a, int b})>[]; // Error
+    const <void Function<S extends T>()>[]; // Error
+    const C<(T, int)>(); // Error
+    const C<({T a, int b})>(); // Error
+    const C<void Function<S extends T>()>(); // Error
     throw '';
   }
 }
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect
index dd2a7d0..256b708 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect
@@ -7,61 +7,129 @@
 //            ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
+//     print(T); // Error
 //           ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
+//     T t; // Error
 //     ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
+//     C<T> l; // Error
 //       ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
+//     C<C<T>> ll; // Error
 //         ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:7: Error: Type variables can't be used in static members.
+//     <(T, int)>[]; // Error
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:8: Error: Type variables can't be used in static members.
+//     <({T a, int b})>[]; // Error
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:30: Error: Type variables can't be used in static members.
+//     <void Function<S extends T>()>[]; // Error
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:13: Error: Type variables can't be used in static members.
+//     const C<T>(); // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:12: Error: Type variables can't be used in static members.
+//     const <T>[]; // Error
 //            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:17:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:18:20: Error: Type variables can't be used in static members.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:19:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:25:13: Error: Type variables can't be used as constants.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:20:13: Error: Type variables can't be used in static members.
+//     const <(T, int)>[]; // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:26:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/general/type_variable_uses.dart:27:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:21:14: Error: Type variables can't be used in static members.
+//     const <({T a, int b})>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:28:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:22:36: Error: Type variables can't be used in static members.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:23:14: Error: Type variables can't be used in static members.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:24:15: Error: Type variables can't be used in static members.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:25:37: Error: Type variables can't be used in static members.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:37:13: Error: Type variables can't be used as constants.
+//     const C<T>(); // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:38:12: Error: Type variables can't be used as constants.
+//     const <T>[]; // Error
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:39:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:40:20: Error: Type variables can't be used as constants.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:29:28: Error: Type variables can't be used as constants.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:41:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
+// pkg/front_end/testcases/general/type_variable_uses.dart:42:13: Error: Type variables can't be used as constants.
+//     const <(T, int)>[]; // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:43:14: Error: Type variables can't be used as constants.
+//     const <({T a, int b})>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:36: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:45:14: Error: Type variables can't be used as constants.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:46:15: Error: Type variables can't be used as constants.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:37: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:5: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:11: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -74,11 +142,20 @@
     invalid-type t;
     self::C<invalid-type> l;
     self::C<self::C<invalid-type>> ll;
+    <(invalid-type, core::int)>[];
+    <({required a: invalid-type, required b: core::int})>[];
+    <<S extends invalid-type>() → void>[];
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    #C9;
+    #C10;
+    #C11;
+    #C12;
     throw "";
   }
   method instanceMethod() → self::C<self::C::T%> {
@@ -86,11 +163,20 @@
     self::C::T% t;
     self::C<self::C::T%> l;
     self::C<self::C<self::C::T%>> ll;
+    <(self::C::T%, core::int)>[];
+    <({required a: self::C::T%, required b: core::int})>[];
+    <<S extends self::C::T%>() → void>[];
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    invalid-expression "Type variables can't be used as constants.";
+    #C10;
+    #C11;
+    invalid-expression "Type variables can't be used as constants.";
     throw "";
   }
 }
@@ -103,6 +189,12 @@
   #C4 = <self::C<invalid-type>>[]
   #C5 = <core::Object>[#C1]
   #C6 = <core::Object>[#C2]
+  #C7 = <(invalid-type, core::int)>[]
+  #C8 = <({required a: invalid-type, required b: core::int})>[]
+  #C9 = <<S extends invalid-type>() → void>[]
+  #C10 = self::C<(invalid-type, core::int)> {}
+  #C11 = self::C<({required a: invalid-type, required b: core::int})> {}
+  #C12 = self::C<<S extends invalid-type>() → void> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
index dd2a7d0..fda6dec 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
@@ -7,61 +7,129 @@
 //            ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
+//     print(T); // Error
 //           ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
+//     T t; // Error
 //     ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
+//     C<T> l; // Error
 //       ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
+//     C<C<T>> ll; // Error
 //         ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:7: Error: Type variables can't be used in static members.
+//     <(T, int)>[]; // Error
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:8: Error: Type variables can't be used in static members.
+//     <({T a, int b})>[]; // Error
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:30: Error: Type variables can't be used in static members.
+//     <void Function<S extends T>()>[]; // Error
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:13: Error: Type variables can't be used in static members.
+//     const C<T>(); // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:12: Error: Type variables can't be used in static members.
+//     const <T>[]; // Error
 //            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:17:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:18:20: Error: Type variables can't be used in static members.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:19:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:25:13: Error: Type variables can't be used as constants.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:20:13: Error: Type variables can't be used in static members.
+//     const <(T, int)>[]; // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:26:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/general/type_variable_uses.dart:27:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:21:14: Error: Type variables can't be used in static members.
+//     const <({T a, int b})>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:28:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:22:36: Error: Type variables can't be used in static members.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:23:14: Error: Type variables can't be used in static members.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:24:15: Error: Type variables can't be used in static members.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:25:37: Error: Type variables can't be used in static members.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:37:13: Error: Type variables can't be used as constants.
+//     const C<T>(); // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:38:12: Error: Type variables can't be used as constants.
+//     const <T>[]; // Error
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:39:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:40:20: Error: Type variables can't be used as constants.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:29:28: Error: Type variables can't be used as constants.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:41:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
+// pkg/front_end/testcases/general/type_variable_uses.dart:42:13: Error: Type variables can't be used as constants.
+//     const <(T, int)>[]; // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:43:14: Error: Type variables can't be used as constants.
+//     const <({T a, int b})>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:36: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:45:14: Error: Type variables can't be used as constants.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:46:15: Error: Type variables can't be used as constants.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:37: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:5: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:11: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -74,11 +142,20 @@
     invalid-type t;
     self::C<invalid-type> l;
     self::C<self::C<invalid-type>> ll;
+    core::_GrowableList::•<(invalid-type, core::int)>(0);
+    core::_GrowableList::•<({required a: invalid-type, required b: core::int})>(0);
+    core::_GrowableList::•<<S extends invalid-type>() → void>(0);
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    #C9;
+    #C10;
+    #C11;
+    #C12;
     throw "";
   }
   method instanceMethod() → self::C<self::C::T%> {
@@ -86,11 +163,20 @@
     self::C::T% t;
     self::C<self::C::T%> l;
     self::C<self::C<self::C::T%>> ll;
+    core::_GrowableList::•<(self::C::T%, core::int)>(0);
+    core::_GrowableList::•<({required a: self::C::T%, required b: core::int})>(0);
+    core::_GrowableList::•<<S extends self::C::T%>() → void>(0);
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    invalid-expression "Type variables can't be used as constants.";
+    #C10;
+    #C11;
+    invalid-expression "Type variables can't be used as constants.";
     throw "";
   }
 }
@@ -103,6 +189,12 @@
   #C4 = <self::C<invalid-type>>[]
   #C5 = <core::Object>[#C1]
   #C6 = <core::Object>[#C2]
+  #C7 = <(invalid-type, core::int)>[]
+  #C8 = <({required a: invalid-type, required b: core::int})>[]
+  #C9 = <<S extends invalid-type>() → void>[]
+  #C10 = self::C<(invalid-type, core::int)> {}
+  #C11 = self::C<({required a: invalid-type, required b: core::int})> {}
+  #C12 = self::C<<S extends invalid-type>() → void> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.expect
index c7757f9..7b92c7b 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.expect
@@ -7,61 +7,129 @@
 //            ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
+//     print(T); // Error
 //           ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
+//     T t; // Error
 //     ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
+//     C<T> l; // Error
 //       ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
+//     C<C<T>> ll; // Error
 //         ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:7: Error: Type variables can't be used in static members.
+//     <(T, int)>[]; // Error
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:8: Error: Type variables can't be used in static members.
+//     <({T a, int b})>[]; // Error
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:30: Error: Type variables can't be used in static members.
+//     <void Function<S extends T>()>[]; // Error
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:13: Error: Type variables can't be used in static members.
+//     const C<T>(); // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:12: Error: Type variables can't be used in static members.
+//     const <T>[]; // Error
 //            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:17:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:18:20: Error: Type variables can't be used in static members.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:19:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:25:13: Error: Type variables can't be used as constants.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:20:13: Error: Type variables can't be used in static members.
+//     const <(T, int)>[]; // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:26:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/general/type_variable_uses.dart:27:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:21:14: Error: Type variables can't be used in static members.
+//     const <({T a, int b})>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:28:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:22:36: Error: Type variables can't be used in static members.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:23:14: Error: Type variables can't be used in static members.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:24:15: Error: Type variables can't be used in static members.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:25:37: Error: Type variables can't be used in static members.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:37:13: Error: Type variables can't be used as constants.
+//     const C<T>(); // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:38:12: Error: Type variables can't be used as constants.
+//     const <T>[]; // Error
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:39:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:40:20: Error: Type variables can't be used as constants.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:29:28: Error: Type variables can't be used as constants.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:41:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
+// pkg/front_end/testcases/general/type_variable_uses.dart:42:13: Error: Type variables can't be used as constants.
+//     const <(T, int)>[]; // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:43:14: Error: Type variables can't be used as constants.
+//     const <({T a, int b})>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:36: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:45:14: Error: Type variables can't be used as constants.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:46:15: Error: Type variables can't be used as constants.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:37: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:5: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:11: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -74,11 +142,20 @@
     invalid-type t;
     self::C<invalid-type> l;
     self::C<self::C<invalid-type>> ll;
+    <(invalid-type, core::int)>[];
+    <({required a: invalid-type, required b: core::int})>[];
+    <<S extends invalid-type>() → void>[];
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    #C9;
+    #C10;
+    #C11;
+    #C12;
     throw "";
   }
   method instanceMethod() → self::C<self::C::T%> {
@@ -86,11 +163,20 @@
     self::C::T% t;
     self::C<self::C::T%> l;
     self::C<self::C<self::C::T%>> ll;
+    <(self::C::T%, core::int)>[];
+    <({required a: self::C::T%, required b: core::int})>[];
+    <<S extends self::C::T%>() → void>[];
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    invalid-expression "Type variables can't be used as constants.";
+    #C10;
+    #C11;
+    invalid-expression "Type variables can't be used as constants.";
     throw "";
   }
 }
@@ -103,6 +189,12 @@
   #C4 = <self::C<invalid-type>*>[]
   #C5 = <core::Object*>[#C1]
   #C6 = <core::Object*>[#C2]
+  #C7 = <(invalid-type, core::int*)*>[]
+  #C8 = <({required a: invalid-type, required b: core::int*})*>[]
+  #C9 = <<S extends invalid-type>() →* void>[]
+  #C10 = self::C<(invalid-type, core::int*)*> {}
+  #C11 = self::C<({required a: invalid-type, required b: core::int*})*> {}
+  #C12 = self::C<<S extends invalid-type>() →* void> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect
index c7757f9..7b92c7b 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect
@@ -7,61 +7,129 @@
 //            ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
+//     print(T); // Error
 //           ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
+//     T t; // Error
 //     ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
+//     C<T> l; // Error
 //       ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
+//     C<C<T>> ll; // Error
 //         ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:7: Error: Type variables can't be used in static members.
+//     <(T, int)>[]; // Error
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:8: Error: Type variables can't be used in static members.
+//     <({T a, int b})>[]; // Error
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:30: Error: Type variables can't be used in static members.
+//     <void Function<S extends T>()>[]; // Error
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:13: Error: Type variables can't be used in static members.
+//     const C<T>(); // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:12: Error: Type variables can't be used in static members.
+//     const <T>[]; // Error
 //            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:17:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:18:20: Error: Type variables can't be used in static members.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:19:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:25:13: Error: Type variables can't be used as constants.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:20:13: Error: Type variables can't be used in static members.
+//     const <(T, int)>[]; // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:26:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/general/type_variable_uses.dart:27:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:21:14: Error: Type variables can't be used in static members.
+//     const <({T a, int b})>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:28:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:22:36: Error: Type variables can't be used in static members.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:23:14: Error: Type variables can't be used in static members.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:24:15: Error: Type variables can't be used in static members.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:25:37: Error: Type variables can't be used in static members.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:37:13: Error: Type variables can't be used as constants.
+//     const C<T>(); // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:38:12: Error: Type variables can't be used as constants.
+//     const <T>[]; // Error
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:39:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:40:20: Error: Type variables can't be used as constants.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:29:28: Error: Type variables can't be used as constants.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:41:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
+// pkg/front_end/testcases/general/type_variable_uses.dart:42:13: Error: Type variables can't be used as constants.
+//     const <(T, int)>[]; // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:43:14: Error: Type variables can't be used as constants.
+//     const <({T a, int b})>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:36: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:45:14: Error: Type variables can't be used as constants.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:46:15: Error: Type variables can't be used as constants.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:37: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:5: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:11: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -74,11 +142,20 @@
     invalid-type t;
     self::C<invalid-type> l;
     self::C<self::C<invalid-type>> ll;
+    <(invalid-type, core::int)>[];
+    <({required a: invalid-type, required b: core::int})>[];
+    <<S extends invalid-type>() → void>[];
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    #C9;
+    #C10;
+    #C11;
+    #C12;
     throw "";
   }
   method instanceMethod() → self::C<self::C::T%> {
@@ -86,11 +163,20 @@
     self::C::T% t;
     self::C<self::C::T%> l;
     self::C<self::C<self::C::T%>> ll;
+    <(self::C::T%, core::int)>[];
+    <({required a: self::C::T%, required b: core::int})>[];
+    <<S extends self::C::T%>() → void>[];
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    invalid-expression "Type variables can't be used as constants.";
+    #C10;
+    #C11;
+    invalid-expression "Type variables can't be used as constants.";
     throw "";
   }
 }
@@ -103,6 +189,12 @@
   #C4 = <self::C<invalid-type>*>[]
   #C5 = <core::Object*>[#C1]
   #C6 = <core::Object*>[#C2]
+  #C7 = <(invalid-type, core::int*)*>[]
+  #C8 = <({required a: invalid-type, required b: core::int*})*>[]
+  #C9 = <<S extends invalid-type>() →* void>[]
+  #C10 = self::C<(invalid-type, core::int*)*> {}
+  #C11 = self::C<({required a: invalid-type, required b: core::int*})*> {}
+  #C12 = self::C<<S extends invalid-type>() →* void> {}
 }
 
 
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.transformed.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.transformed.expect
index c7757f9..c3d8549 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.transformed.expect
@@ -7,61 +7,129 @@
 //            ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
+//     print(T); // Error
 //           ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
+//     T t; // Error
 //     ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
+//     C<T> l; // Error
 //       ^
 //
 // pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
+//     C<C<T>> ll; // Error
 //         ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:7: Error: Type variables can't be used in static members.
+//     <(T, int)>[]; // Error
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:8: Error: Type variables can't be used in static members.
+//     <({T a, int b})>[]; // Error
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:30: Error: Type variables can't be used in static members.
+//     <void Function<S extends T>()>[]; // Error
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:13: Error: Type variables can't be used in static members.
+//     const C<T>(); // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:12: Error: Type variables can't be used in static members.
+//     const <T>[]; // Error
 //            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:17:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:18:20: Error: Type variables can't be used in static members.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:19:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:25:13: Error: Type variables can't be used as constants.
-//     const C<T>();
+// pkg/front_end/testcases/general/type_variable_uses.dart:20:13: Error: Type variables can't be used in static members.
+//     const <(T, int)>[]; // Error
 //             ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:26:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/general/type_variable_uses.dart:27:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
+// pkg/front_end/testcases/general/type_variable_uses.dart:21:14: Error: Type variables can't be used in static members.
+//     const <({T a, int b})>[]; // Error
 //              ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:28:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
+// pkg/front_end/testcases/general/type_variable_uses.dart:22:36: Error: Type variables can't be used in static members.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:23:14: Error: Type variables can't be used in static members.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:24:15: Error: Type variables can't be used in static members.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:25:37: Error: Type variables can't be used in static members.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:37:13: Error: Type variables can't be used as constants.
+//     const C<T>(); // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:38:12: Error: Type variables can't be used as constants.
+//     const <T>[]; // Error
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:39:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:40:20: Error: Type variables can't be used as constants.
+//     const <Object>[T]; // Error
 //                    ^
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:29:28: Error: Type variables can't be used as constants.
-//     const <Object>[const C<T>()];
+// pkg/front_end/testcases/general/type_variable_uses.dart:41:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()]; // Error
 //                            ^
 //
+// pkg/front_end/testcases/general/type_variable_uses.dart:42:13: Error: Type variables can't be used as constants.
+//     const <(T, int)>[]; // Error
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:43:14: Error: Type variables can't be used as constants.
+//     const <({T a, int b})>[]; // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:36: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:45:14: Error: Type variables can't be used as constants.
+//     const C<(T, int)>(); // Error
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:46:15: Error: Type variables can't be used as constants.
+//     const C<({T a, int b})>(); // Error
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:37: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//                                     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:44:5: Error: Type variables can't be used as constants.
+//     const <void Function<S extends T>()>[]; // Error
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:47:11: Error: Type variables can't be used as constants.
+//     const C<void Function<S extends T>()>(); // Error
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -74,11 +142,20 @@
     invalid-type t;
     self::C<invalid-type> l;
     self::C<self::C<invalid-type>> ll;
+    core::_GrowableList::•<(invalid-type, core::int)>(0);
+    core::_GrowableList::•<({required a: invalid-type, required b: core::int})>(0);
+    core::_GrowableList::•<<S extends invalid-type>() → void>(0);
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    #C9;
+    #C10;
+    #C11;
+    #C12;
     throw "";
   }
   method instanceMethod() → self::C<self::C::T%> {
@@ -86,11 +163,20 @@
     self::C::T% t;
     self::C<self::C::T%> l;
     self::C<self::C<self::C::T%>> ll;
+    core::_GrowableList::•<(self::C::T%, core::int)>(0);
+    core::_GrowableList::•<({required a: self::C::T%, required b: core::int})>(0);
+    core::_GrowableList::•<<S extends self::C::T%>() → void>(0);
     #C2;
     #C3;
     #C4;
     #C5;
     #C6;
+    #C7;
+    #C8;
+    invalid-expression "Type variables can't be used as constants.";
+    #C10;
+    #C11;
+    invalid-expression "Type variables can't be used as constants.";
     throw "";
   }
 }
@@ -103,6 +189,12 @@
   #C4 = <self::C<invalid-type>*>[]
   #C5 = <core::Object*>[#C1]
   #C6 = <core::Object*>[#C2]
+  #C7 = <(invalid-type, core::int*)*>[]
+  #C8 = <({required a: invalid-type, required b: core::int*})*>[]
+  #C9 = <<S extends invalid-type>() →* void>[]
+  #C10 = self::C<(invalid-type, core::int*)*> {}
+  #C11 = self::C<({required a: invalid-type, required b: core::int*})*> {}
+  #C12 = self::C<<S extends invalid-type>() →* void> {}
 }
 
 
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart
index 293a967..9bde3c0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart
@@ -15,6 +15,10 @@
 class D<X extends B<X, Y>, Y extends C<X, Y>, Z extends X Function(Y),
     W extends num> {}
 
+class E<X extends (B<X, Y>, int), Y extends ({C<X, Y> c, int d}),
+    Z extends (int, X Function(Y)), W extends ({num a})> {}
+
 main() {
   D d;
+  E e;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
index 51df89ea..79c86f7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
@@ -17,6 +17,12 @@
     : super core::Object::•()
     ;
 }
+class E<X extends (self::B<self::E::X, self::E::Y>, core::int) = (self::B<dynamic, dynamic>, core::int), Y extends ({required c: self::C<self::E::X, self::E::Y>, required d: core::int}) = ({required c: self::C<dynamic, dynamic>, required d: core::int}), Z extends (core::int, (self::E::Y) → self::E::X) = (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), W extends ({required a: core::num})> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X, self::E::Y, self::E::Z, self::E::W>
+    : super core::Object::•()
+    ;
+}
 static method main() → dynamic {
   self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (Never) → self::B<dynamic, dynamic>, core::num> d;
+  self::E<(self::B<dynamic, dynamic>, core::int), ({required c: self::C<dynamic, dynamic>, required d: core::int}), (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), ({required a: core::num})> e;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
index 51df89ea..79c86f7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
@@ -17,6 +17,12 @@
     : super core::Object::•()
     ;
 }
+class E<X extends (self::B<self::E::X, self::E::Y>, core::int) = (self::B<dynamic, dynamic>, core::int), Y extends ({required c: self::C<self::E::X, self::E::Y>, required d: core::int}) = ({required c: self::C<dynamic, dynamic>, required d: core::int}), Z extends (core::int, (self::E::Y) → self::E::X) = (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), W extends ({required a: core::num})> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X, self::E::Y, self::E::Z, self::E::W>
+    : super core::Object::•()
+    ;
+}
 static method main() → dynamic {
   self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (Never) → self::B<dynamic, dynamic>, core::num> d;
+  self::E<(self::B<dynamic, dynamic>, core::int), ({required c: self::C<dynamic, dynamic>, required d: core::int}), (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), ({required a: core::num})> e;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline.expect
index a476c9a..c794045 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline.expect
@@ -5,4 +5,7 @@
 class D<X extends B<X, Y>, Y extends C<X, Y>, Z extends X Function(Y),
     W extends num> {}
 
+class E<X extends (B<X, Y>, int), Y extends ({C<X, Y> c, int d}),
+    Z extends (int, X Function(Y)), W extends ({num a})> {}
+
 main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline_modelled.expect
index a476c9a..c794045 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.textual_outline_modelled.expect
@@ -5,4 +5,7 @@
 class D<X extends B<X, Y>, Y extends C<X, Y>, Z extends X Function(Y),
     W extends num> {}
 
+class E<X extends (B<X, Y>, int), Y extends ({C<X, Y> c, int d}),
+    Z extends (int, X Function(Y)), W extends ({num a})> {}
+
 main() {}
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 51df89ea..79c86f7 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
@@ -17,6 +17,12 @@
     : super core::Object::•()
     ;
 }
+class E<X extends (self::B<self::E::X, self::E::Y>, core::int) = (self::B<dynamic, dynamic>, core::int), Y extends ({required c: self::C<self::E::X, self::E::Y>, required d: core::int}) = ({required c: self::C<dynamic, dynamic>, required d: core::int}), Z extends (core::int, (self::E::Y) → self::E::X) = (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), W extends ({required a: core::num})> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X, self::E::Y, self::E::Z, self::E::W>
+    : super core::Object::•()
+    ;
+}
 static method main() → dynamic {
   self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (Never) → self::B<dynamic, dynamic>, core::num> d;
+  self::E<(self::B<dynamic, dynamic>, core::int), ({required c: self::C<dynamic, dynamic>, required d: core::int}), (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), ({required a: core::num})> e;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect
index 51df89ea..79c86f7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect
@@ -17,6 +17,12 @@
     : super core::Object::•()
     ;
 }
+class E<X extends (self::B<self::E::X, self::E::Y>, core::int) = (self::B<dynamic, dynamic>, core::int), Y extends ({required c: self::C<self::E::X, self::E::Y>, required d: core::int}) = ({required c: self::C<dynamic, dynamic>, required d: core::int}), Z extends (core::int, (self::E::Y) → self::E::X) = (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), W extends ({required a: core::num})> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X, self::E::Y, self::E::Z, self::E::W>
+    : super core::Object::•()
+    ;
+}
 static method main() → dynamic {
   self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (Never) → self::B<dynamic, dynamic>, core::num> d;
+  self::E<(self::B<dynamic, dynamic>, core::int), ({required c: self::C<dynamic, dynamic>, required d: core::int}), (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), ({required a: core::num})> e;
 }
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 5dd3b71..cef94c6 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
@@ -14,5 +14,9 @@
   synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
     ;
 }
+class E<X extends (self::B<self::E::X, self::E::Y>, core::int) = (self::B<dynamic, dynamic>, core::int), Y extends ({required c: self::C<self::E::X, self::E::Y>, required d: core::int}) = ({required c: self::C<dynamic, dynamic>, required d: core::int}), Z extends (core::int, (self::E::Y) → self::E::X) = (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), W extends ({required a: core::num})> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X, self::E::Y, self::E::Z, self::E::W>
+    ;
+}
 static method main() → dynamic
   ;
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 51df89ea..79c86f7 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
@@ -17,6 +17,12 @@
     : super core::Object::•()
     ;
 }
+class E<X extends (self::B<self::E::X, self::E::Y>, core::int) = (self::B<dynamic, dynamic>, core::int), Y extends ({required c: self::C<self::E::X, self::E::Y>, required d: core::int}) = ({required c: self::C<dynamic, dynamic>, required d: core::int}), Z extends (core::int, (self::E::Y) → self::E::X) = (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), W extends ({required a: core::num})> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X, self::E::Y, self::E::Z, self::E::W>
+    : super core::Object::•()
+    ;
+}
 static method main() → dynamic {
   self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (Never) → self::B<dynamic, dynamic>, core::num> d;
+  self::E<(self::B<dynamic, dynamic>, core::int), ({required c: self::C<dynamic, dynamic>, required d: core::int}), (core::int, (Never) → (self::B<dynamic, dynamic>, core::int)), ({required a: core::num})> e;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart
index d3acace..518e3a3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart
@@ -6,8 +6,16 @@
 // when both class declaration and a parametrized typedef participate in the
 // cycle.
 
-class Hest<TypeX extends Fisk> {}
+class Class1<X1 extends Typedef1> {}
 
-typedef Fisk = void Function<TypeY extends Hest>();
+typedef Typedef1 = void Function<Y1 extends Class1>();
+
+class Class2<X2 extends Typedef2> {}
+
+typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+
+class Class3<X3 extends Typedef3> {}
+
+typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
 
 main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.expect
index 5a5d321..5d2a111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.expect
@@ -2,23 +2,50 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
-// class Hest<TypeX extends Fisk> {}
-//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:7: Error: Generic type 'Class1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef1'.
+// Try providing type arguments to 'Typedef1' here or to some other raw types in the bounds along the reference chain.
+// class Class1<X1 extends Typedef1> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:14: Context: Bound of this variable references raw type 'Typedef1'.
+// class Class1<X1 extends Typedef1> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:34: Context: Bound of this variable references raw type 'Class1'.
+// typedef Typedef1 = void Function<Y1 extends Class1>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:7: Error: Generic type 'Class2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef2'.
+// Try providing type arguments to 'Typedef2' here or to some other raw types in the bounds along the reference chain.
+// class Class2<X2 extends Typedef2> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:14: Context: Bound of this variable references raw type 'Typedef2'.
+// class Class2<X2 extends Typedef2> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:15:34: Context: Bound of this variable references raw type 'Class2'.
+// typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:19:9: Error: The typedef 'Typedef3' has a reference to itself.
+// typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
+//         ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends core::Object? = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Typedef1 = <Y1 extends self::Class1<dynamic> = dynamic>() → void;
+typedef Typedef2 = <Y2 extends (self::Class2<dynamic>, core::int) = dynamic>() → void;
+typedef Typedef3 = invalid-type;
+class Class1<X1 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::X1%>
+    : super core::Object::•()
+    ;
+}
+class Class2<X2 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::X2%>
+    : super core::Object::•()
+    ;
+}
+class Class3<X3 extends invalid-type> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::X3%>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.transformed.expect
index 5a5d321..5d2a111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.strong.transformed.expect
@@ -2,23 +2,50 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
-// class Hest<TypeX extends Fisk> {}
-//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:7: Error: Generic type 'Class1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef1'.
+// Try providing type arguments to 'Typedef1' here or to some other raw types in the bounds along the reference chain.
+// class Class1<X1 extends Typedef1> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:14: Context: Bound of this variable references raw type 'Typedef1'.
+// class Class1<X1 extends Typedef1> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:34: Context: Bound of this variable references raw type 'Class1'.
+// typedef Typedef1 = void Function<Y1 extends Class1>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:7: Error: Generic type 'Class2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef2'.
+// Try providing type arguments to 'Typedef2' here or to some other raw types in the bounds along the reference chain.
+// class Class2<X2 extends Typedef2> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:14: Context: Bound of this variable references raw type 'Typedef2'.
+// class Class2<X2 extends Typedef2> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:15:34: Context: Bound of this variable references raw type 'Class2'.
+// typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:19:9: Error: The typedef 'Typedef3' has a reference to itself.
+// typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
+//         ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends core::Object? = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Typedef1 = <Y1 extends self::Class1<dynamic> = dynamic>() → void;
+typedef Typedef2 = <Y2 extends (self::Class2<dynamic>, core::int) = dynamic>() → void;
+typedef Typedef3 = invalid-type;
+class Class1<X1 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::X1%>
+    : super core::Object::•()
+    ;
+}
+class Class2<X2 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::X2%>
+    : super core::Object::•()
+    ;
+}
+class Class3<X3 extends invalid-type> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::X3%>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline.expect
index e977e49..5545579 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline.expect
@@ -1,4 +1,12 @@
-class Hest<TypeX extends Fisk> {}
+class Class1<X1 extends Typedef1> {}
 
-typedef Fisk = void Function<TypeY extends Hest>();
+typedef Typedef1 = void Function<Y1 extends Class1>();
+
+class Class2<X2 extends Typedef2> {}
+
+typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+
+class Class3<X3 extends Typedef3> {}
+
+typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
 main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline_modelled.expect
index 7213ffd..19dd5e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.textual_outline_modelled.expect
@@ -1,4 +1,10 @@
-class Hest<TypeX extends Fisk> {}
+class Class1<X1 extends Typedef1> {}
+
+class Class2<X2 extends Typedef2> {}
+
+class Class3<X3 extends Typedef3> {}
 
 main() {}
-typedef Fisk = void Function<TypeY extends Hest>();
+typedef Typedef1 = void Function<Y1 extends Class1>();
+typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.expect
index 5a5d321..5d2a111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.expect
@@ -2,23 +2,50 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
-// class Hest<TypeX extends Fisk> {}
-//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:7: Error: Generic type 'Class1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef1'.
+// Try providing type arguments to 'Typedef1' here or to some other raw types in the bounds along the reference chain.
+// class Class1<X1 extends Typedef1> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:14: Context: Bound of this variable references raw type 'Typedef1'.
+// class Class1<X1 extends Typedef1> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:34: Context: Bound of this variable references raw type 'Class1'.
+// typedef Typedef1 = void Function<Y1 extends Class1>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:7: Error: Generic type 'Class2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef2'.
+// Try providing type arguments to 'Typedef2' here or to some other raw types in the bounds along the reference chain.
+// class Class2<X2 extends Typedef2> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:14: Context: Bound of this variable references raw type 'Typedef2'.
+// class Class2<X2 extends Typedef2> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:15:34: Context: Bound of this variable references raw type 'Class2'.
+// typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:19:9: Error: The typedef 'Typedef3' has a reference to itself.
+// typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
+//         ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends core::Object? = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Typedef1 = <Y1 extends self::Class1<dynamic> = dynamic>() → void;
+typedef Typedef2 = <Y2 extends (self::Class2<dynamic>, core::int) = dynamic>() → void;
+typedef Typedef3 = invalid-type;
+class Class1<X1 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::X1%>
+    : super core::Object::•()
+    ;
+}
+class Class2<X2 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::X2%>
+    : super core::Object::•()
+    ;
+}
+class Class3<X3 extends invalid-type> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::X3%>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.modular.expect
index 5a5d321..5d2a111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.modular.expect
@@ -2,23 +2,50 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
-// class Hest<TypeX extends Fisk> {}
-//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:7: Error: Generic type 'Class1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef1'.
+// Try providing type arguments to 'Typedef1' here or to some other raw types in the bounds along the reference chain.
+// class Class1<X1 extends Typedef1> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:14: Context: Bound of this variable references raw type 'Typedef1'.
+// class Class1<X1 extends Typedef1> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:34: Context: Bound of this variable references raw type 'Class1'.
+// typedef Typedef1 = void Function<Y1 extends Class1>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:7: Error: Generic type 'Class2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef2'.
+// Try providing type arguments to 'Typedef2' here or to some other raw types in the bounds along the reference chain.
+// class Class2<X2 extends Typedef2> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:14: Context: Bound of this variable references raw type 'Typedef2'.
+// class Class2<X2 extends Typedef2> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:15:34: Context: Bound of this variable references raw type 'Class2'.
+// typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:19:9: Error: The typedef 'Typedef3' has a reference to itself.
+// typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
+//         ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends core::Object? = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Typedef1 = <Y1 extends self::Class1<dynamic> = dynamic>() → void;
+typedef Typedef2 = <Y2 extends (self::Class2<dynamic>, core::int) = dynamic>() → void;
+typedef Typedef3 = invalid-type;
+class Class1<X1 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::X1%>
+    : super core::Object::•()
+    ;
+}
+class Class2<X2 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::X2%>
+    : super core::Object::•()
+    ;
+}
+class Class3<X3 extends invalid-type> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::X3%>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.outline.expect
index a4320b7..107e90d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.outline.expect
@@ -2,23 +2,48 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
-// class Hest<TypeX extends Fisk> {}
-//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:7: Error: Generic type 'Class1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef1'.
+// Try providing type arguments to 'Typedef1' here or to some other raw types in the bounds along the reference chain.
+// class Class1<X1 extends Typedef1> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:14: Context: Bound of this variable references raw type 'Typedef1'.
+// class Class1<X1 extends Typedef1> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:34: Context: Bound of this variable references raw type 'Class1'.
+// typedef Typedef1 = void Function<Y1 extends Class1>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:7: Error: Generic type 'Class2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef2'.
+// Try providing type arguments to 'Typedef2' here or to some other raw types in the bounds along the reference chain.
+// class Class2<X2 extends Typedef2> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:14: Context: Bound of this variable references raw type 'Typedef2'.
+// class Class2<X2 extends Typedef2> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:15:34: Context: Bound of this variable references raw type 'Class2'.
+// typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:19:9: Error: The typedef 'Typedef3' has a reference to itself.
+// typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
+//         ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends core::Object? = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Typedef1 = <Y1 extends self::Class1<dynamic> = dynamic>() → void;
+typedef Typedef2 = <Y2 extends (self::Class2<dynamic>, core::int) = dynamic>() → void;
+typedef Typedef3 = invalid-type;
+class Class1<X1 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::X1%>
+    ;
+}
+class Class2<X2 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::X2%>
+    ;
+}
+class Class3<X3 extends invalid-type> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::X3%>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.transformed.expect
index 5a5d321..5d2a111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart.weak.transformed.expect
@@ -2,23 +2,50 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
-// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//         ^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
-// typedef Fisk = void Function<TypeY extends Hest>();
-//                              ^^^^^
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
-// class Hest<TypeX extends Fisk> {}
-//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:7: Error: Generic type 'Class1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef1'.
+// Try providing type arguments to 'Typedef1' here or to some other raw types in the bounds along the reference chain.
+// class Class1<X1 extends Typedef1> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:9:14: Context: Bound of this variable references raw type 'Typedef1'.
+// class Class1<X1 extends Typedef1> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:11:34: Context: Bound of this variable references raw type 'Class1'.
+// typedef Typedef1 = void Function<Y1 extends Class1>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:7: Error: Generic type 'Class2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Typedef2'.
+// Try providing type arguments to 'Typedef2' here or to some other raw types in the bounds along the reference chain.
+// class Class2<X2 extends Typedef2> {}
+//       ^^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:13:14: Context: Bound of this variable references raw type 'Typedef2'.
+// class Class2<X2 extends Typedef2> {}
+//              ^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:15:34: Context: Bound of this variable references raw type 'Class2'.
+// typedef Typedef2 = void Function<Y2 extends (Class2, int)>();
+//                                  ^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle2.dart:19:9: Error: The typedef 'Typedef3' has a reference to itself.
+// typedef Typedef3 = (void Function<Y3 extends Class3>(), int);
+//         ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends core::Object? = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends core::Object? = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Typedef1 = <Y1 extends self::Class1<dynamic> = dynamic>() → void;
+typedef Typedef2 = <Y2 extends (self::Class2<dynamic>, core::int) = dynamic>() → void;
+typedef Typedef3 = invalid-type;
+class Class1<X1 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::X1%>
+    : super core::Object::•()
+    ;
+}
+class Class2<X2 extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::X2%>
+    : super core::Object::•()
+    ;
+}
+class Class3<X3 extends invalid-type> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::X3%>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
index ffb5a18..4400d31 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
@@ -13,41 +13,38 @@
 // class A<TypeY extends lib.A> {}
 //         ^^^^^
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:13:9: Error: The typedef 'C' has a reference to itself.
+// typedef C<TypeX extends lib.C> = int;
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-typedef C<unrelated TypeX extends invalid-type> = core::int;
+typedef C<unrelated TypeX extends core::int> = invalid-type;
 class A<TypeX extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::TypeX%>
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeX extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
-  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 library non_simple_many_libs_same_name_cycle_lib;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:18:9: Error: The typedef 'C' has a reference to itself.
-// typedef C<TypeY extends lib.C> = int;
-//         ^
-//
 import self as self2;
 import "dart:core" as core;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-typedef C<unrelated TypeY extends core::int> = invalid-type;
+typedef C<unrelated TypeY extends invalid-type> = core::int;
 class A<TypeY extends self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::TypeY>
     : super core::Object::•()
     ;
 }
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeY extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
+  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
   #C1 = 0
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
index ffb5a18..4400d31 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
@@ -13,41 +13,38 @@
 // class A<TypeY extends lib.A> {}
 //         ^^^^^
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:13:9: Error: The typedef 'C' has a reference to itself.
+// typedef C<TypeX extends lib.C> = int;
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-typedef C<unrelated TypeX extends invalid-type> = core::int;
+typedef C<unrelated TypeX extends core::int> = invalid-type;
 class A<TypeX extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::TypeX%>
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeX extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
-  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 library non_simple_many_libs_same_name_cycle_lib;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:18:9: Error: The typedef 'C' has a reference to itself.
-// typedef C<TypeY extends lib.C> = int;
-//         ^
-//
 import self as self2;
 import "dart:core" as core;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-typedef C<unrelated TypeY extends core::int> = invalid-type;
+typedef C<unrelated TypeY extends invalid-type> = core::int;
 class A<TypeY extends self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::TypeY>
     : super core::Object::•()
     ;
 }
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeY extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
+  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
   #C1 = 0
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 ffb5a18..4400d31 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
@@ -13,41 +13,38 @@
 // class A<TypeY extends lib.A> {}
 //         ^^^^^
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:13:9: Error: The typedef 'C' has a reference to itself.
+// typedef C<TypeX extends lib.C> = int;
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-typedef C<unrelated TypeX extends invalid-type> = core::int;
+typedef C<unrelated TypeX extends core::int> = invalid-type;
 class A<TypeX extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::TypeX%>
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeX extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
-  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 library non_simple_many_libs_same_name_cycle_lib;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:18:9: Error: The typedef 'C' has a reference to itself.
-// typedef C<TypeY extends lib.C> = int;
-//         ^
-//
 import self as self2;
 import "dart:core" as core;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-typedef C<unrelated TypeY extends core::int> = invalid-type;
+typedef C<unrelated TypeY extends invalid-type> = core::int;
 class A<TypeY extends self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::TypeY>
     : super core::Object::•()
     ;
 }
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeY extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
+  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
   #C1 = 0
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect
index ffb5a18..4400d31 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect
@@ -13,41 +13,38 @@
 // class A<TypeY extends lib.A> {}
 //         ^^^^^
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:13:9: Error: The typedef 'C' has a reference to itself.
+// typedef C<TypeX extends lib.C> = int;
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-typedef C<unrelated TypeX extends invalid-type> = core::int;
+typedef C<unrelated TypeX extends core::int> = invalid-type;
 class A<TypeX extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::TypeX%>
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeX extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
-  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 library non_simple_many_libs_same_name_cycle_lib;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:18:9: Error: The typedef 'C' has a reference to itself.
-// typedef C<TypeY extends lib.C> = int;
-//         ^
-//
 import self as self2;
 import "dart:core" as core;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-typedef C<unrelated TypeY extends core::int> = invalid-type;
+typedef C<unrelated TypeY extends invalid-type> = core::int;
 class A<TypeY extends self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::TypeY>
     : super core::Object::•()
     ;
 }
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeY extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
+  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
   #C1 = 0
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 e87eae6..c0ec1f8 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
@@ -13,37 +13,34 @@
 // class A<TypeY extends lib.A> {}
 //         ^^^^^
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:13:9: Error: The typedef 'C' has a reference to itself.
+// typedef C<TypeX extends lib.C> = int;
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-typedef C<unrelated TypeX extends invalid-type> = core::int;
+typedef C<unrelated TypeX extends core::int> = invalid-type;
 class A<TypeX extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::TypeX%>
     ;
 }
 static method main() → dynamic
   ;
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeX extends invalid-type>(core::String name, {has-declared-initializer core::int defaultValue}) → core::int
-  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 library non_simple_many_libs_same_name_cycle_lib;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:18:9: Error: The typedef 'C' has a reference to itself.
-// typedef C<TypeY extends lib.C> = int;
-//         ^
-//
 import self as self2;
 import "dart:core" as core;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-typedef C<unrelated TypeY extends core::int> = invalid-type;
+typedef C<unrelated TypeY extends invalid-type> = core::int;
 class A<TypeY extends self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::TypeY>
     ;
 }
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeY extends invalid-type>(core::String name, {has-declared-initializer core::int defaultValue}) → core::int
+  return core::int::fromEnvironment(name, defaultValue: defaultValue);
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 ffb5a18..4400d31 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
@@ -13,41 +13,38 @@
 // class A<TypeY extends lib.A> {}
 //         ^^^^^
 //
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:13:9: Error: The typedef 'C' has a reference to itself.
+// typedef C<TypeX extends lib.C> = int;
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-typedef C<unrelated TypeX extends invalid-type> = core::int;
+typedef C<unrelated TypeX extends core::int> = invalid-type;
 class A<TypeX extends core::Object? = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::TypeX%>
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
-static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeX extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
-  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 library non_simple_many_libs_same_name_cycle_lib;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:18:9: Error: The typedef 'C' has a reference to itself.
-// typedef C<TypeY extends lib.C> = int;
-//         ^
-//
 import self as self2;
 import "dart:core" as core;
 import "non_simple_many_libs_same_name_cycle.dart" as self;
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-typedef C<unrelated TypeY extends core::int> = invalid-type;
+typedef C<unrelated TypeY extends invalid-type> = core::int;
 class A<TypeY extends self::A<dynamic>> extends core::Object {
   synthetic constructor •() → self2::A<self2::A::TypeY>
     : super core::Object::•()
     ;
 }
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm_shared/lib/integers_patch.dart */ _#C#fromEnvironment#tearOff<unrelated TypeY extends invalid-type>(core::String name, {core::int defaultValue = #C1}) → core::int
+  return core::int::fromEnvironment(name, defaultValue: defaultValue);
 
 constants  {
   #C1 = 0
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart b/pkg/front_end/testcases/nnbd/issue34803.dart
index 0069fc6d..f20617d 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart
@@ -2,9 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart=2.13
+class A<X1 extends G<num>> {}
+typedef G<X1> = void Function<Y1 extends X1>();
 
-class A<X extends G<num>> {}
-typedef G<X> = void Function<Y extends X>();
+class B<X2 extends H<num>> {}
+typedef H<X2> = (void Function<Y2 extends X2>(), int);
+
+class C<X3 extends I<num>> {}
+typedef I<X3> = ({void Function<Y3 extends X3>() a, int b});
 
 main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect
index 52c352c..3a552b4 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.expect
@@ -1,17 +1,22 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
-// class A<X extends G<num>> {}
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
-class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+typedef G<invariant X1 extends core::Object? = dynamic> = <Y1 extends X1% = dynamic>() → void;
+typedef H<invariant X2 extends core::Object? = dynamic> = (<Y2 extends X2% = dynamic>() → void, core::int);
+typedef I<invariant X3 extends core::Object? = dynamic> = ({required a: <Y3 extends X3% = dynamic>() → void, required b: core::int});
+class A<X1 extends <Y1 extends core::num = dynamic>() → void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X1>
+    : super core::Object::•()
+    ;
+}
+class B<X2 extends (<Y2 extends core::num = dynamic>() → void, core::int)> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X2>
+    : super core::Object::•()
+    ;
+}
+class C<X3 extends ({required a: <Y3 extends core::num = dynamic>() → void, required b: core::int})> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X3>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect
index 52c352c..3a552b4 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.strong.transformed.expect
@@ -1,17 +1,22 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
-// class A<X extends G<num>> {}
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
-class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+typedef G<invariant X1 extends core::Object? = dynamic> = <Y1 extends X1% = dynamic>() → void;
+typedef H<invariant X2 extends core::Object? = dynamic> = (<Y2 extends X2% = dynamic>() → void, core::int);
+typedef I<invariant X3 extends core::Object? = dynamic> = ({required a: <Y3 extends X3% = dynamic>() → void, required b: core::int});
+class A<X1 extends <Y1 extends core::num = dynamic>() → void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X1>
+    : super core::Object::•()
+    ;
+}
+class B<X2 extends (<Y2 extends core::num = dynamic>() → void, core::int)> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X2>
+    : super core::Object::•()
+    ;
+}
+class C<X3 extends ({required a: <Y3 extends core::num = dynamic>() → void, required b: core::int})> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X3>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect
index 987cefd..6b14eb1 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline.expect
@@ -1,5 +1,12 @@
-// @dart = 2.13
-class A<X extends G<num>> {}
+class A<X1 extends G<num>> {}
 
-typedef G<X> = void Function<Y extends X>();
+typedef G<X1> = void Function<Y1 extends X1>();
+
+class B<X2 extends H<num>> {}
+
+typedef H<X2> = (void Function<Y2 extends X2>(), int);
+
+class C<X3 extends I<num>> {}
+
+typedef I<X3> = ({void Function<Y3 extends X3>() a, int b});
 main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect
index ff10684..28edc37 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.textual_outline_modelled.expect
@@ -1,5 +1,10 @@
-// @dart = 2.13
-class A<X extends G<num>> {}
+class A<X1 extends G<num>> {}
+
+class B<X2 extends H<num>> {}
+
+class C<X3 extends I<num>> {}
 
 main() {}
-typedef G<X> = void Function<Y extends X>();
+typedef G<X1> = void Function<Y1 extends X1>();
+typedef H<X2> = (void Function<Y2 extends X2>(), int);
+typedef I<X3> = ({void Function<Y3 extends X3>() a, int b});
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect
index 52c352c..3a552b4 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.expect
@@ -1,17 +1,22 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
-// class A<X extends G<num>> {}
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
-class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+typedef G<invariant X1 extends core::Object? = dynamic> = <Y1 extends X1% = dynamic>() → void;
+typedef H<invariant X2 extends core::Object? = dynamic> = (<Y2 extends X2% = dynamic>() → void, core::int);
+typedef I<invariant X3 extends core::Object? = dynamic> = ({required a: <Y3 extends X3% = dynamic>() → void, required b: core::int});
+class A<X1 extends <Y1 extends core::num = dynamic>() → void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X1>
+    : super core::Object::•()
+    ;
+}
+class B<X2 extends (<Y2 extends core::num = dynamic>() → void, core::int)> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X2>
+    : super core::Object::•()
+    ;
+}
+class C<X3 extends ({required a: <Y3 extends core::num = dynamic>() → void, required b: core::int})> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X3>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect
index 52c352c..3a552b4 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect
@@ -1,17 +1,22 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
-// class A<X extends G<num>> {}
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
-class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+typedef G<invariant X1 extends core::Object? = dynamic> = <Y1 extends X1% = dynamic>() → void;
+typedef H<invariant X2 extends core::Object? = dynamic> = (<Y2 extends X2% = dynamic>() → void, core::int);
+typedef I<invariant X3 extends core::Object? = dynamic> = ({required a: <Y3 extends X3% = dynamic>() → void, required b: core::int});
+class A<X1 extends <Y1 extends core::num = dynamic>() → void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X1>
+    : super core::Object::•()
+    ;
+}
+class B<X2 extends (<Y2 extends core::num = dynamic>() → void, core::int)> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X2>
+    : super core::Object::•()
+    ;
+}
+class C<X3 extends ({required a: <Y3 extends core::num = dynamic>() → void, required b: core::int})> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X3>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.outline.expect
index 7ea1512..7c735eb 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.outline.expect
@@ -1,17 +1,20 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
-// class A<X extends G<num>> {}
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
-class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+typedef G<invariant X1 extends core::Object? = dynamic> = <Y1 extends X1% = dynamic>() → void;
+typedef H<invariant X2 extends core::Object? = dynamic> = (<Y2 extends X2% = dynamic>() → void, core::int);
+typedef I<invariant X3 extends core::Object? = dynamic> = ({required a: <Y3 extends X3% = dynamic>() → void, required b: core::int});
+class A<X1 extends <Y1 extends core::num = dynamic>() → void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X1>
+    ;
+}
+class B<X2 extends (<Y2 extends core::num = dynamic>() → void, core::int)> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X2>
+    ;
+}
+class C<X3 extends ({required a: <Y3 extends core::num = dynamic>() → void, required b: core::int})> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X3>
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect
index 52c352c..3a552b4 100644
--- a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.transformed.expect
@@ -1,17 +1,22 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
-// class A<X extends G<num>> {}
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
-typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
-class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+typedef G<invariant X1 extends core::Object? = dynamic> = <Y1 extends X1% = dynamic>() → void;
+typedef H<invariant X2 extends core::Object? = dynamic> = (<Y2 extends X2% = dynamic>() → void, core::int);
+typedef I<invariant X3 extends core::Object? = dynamic> = ({required a: <Y3 extends X3% = dynamic>() → void, required b: core::int});
+class A<X1 extends <Y1 extends core::num = dynamic>() → void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X1>
+    : super core::Object::•()
+    ;
+}
+class B<X2 extends (<Y2 extends core::num = dynamic>() → void, core::int)> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X2>
+    : super core::Object::•()
+    ;
+}
+class C<X3 extends ({required a: <Y3 extends core::num = dynamic>() → void, required b: core::int})> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X3>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/records/issue50182.dart.strong.expect b/pkg/front_end/testcases/records/issue50182.dart.strong.expect
index aec4e08..3e502c4 100644
--- a/pkg/front_end/testcases/records/issue50182.dart.strong.expect
+++ b/pkg/front_end/testcases/records/issue50182.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Hello<unrelated T extends core::Object? = dynamic> = (T%, {required name: T%});
+typedef Hello<T extends core::Object? = dynamic> = (T%, {required name: T%});
 class MyClass<T extends core::Object? = dynamic> extends core::Object {
   final field () → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField;
   constructor •(() → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField) → self::MyClass<self::MyClass::T%>
diff --git a/pkg/front_end/testcases/records/issue50182.dart.strong.transformed.expect b/pkg/front_end/testcases/records/issue50182.dart.strong.transformed.expect
index 85bd7f3..01b4cac 100644
--- a/pkg/front_end/testcases/records/issue50182.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/records/issue50182.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Hello<unrelated T extends core::Object? = dynamic> = (T%, {required name: T%});
+typedef Hello<T extends core::Object? = dynamic> = (T%, {required name: T%});
 class MyClass<T extends core::Object? = dynamic> extends core::Object {
   final field () → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField;
   constructor •(() → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField) → self::MyClass<self::MyClass::T%>
diff --git a/pkg/front_end/testcases/records/issue50182.dart.weak.expect b/pkg/front_end/testcases/records/issue50182.dart.weak.expect
index aec4e08..3e502c4 100644
--- a/pkg/front_end/testcases/records/issue50182.dart.weak.expect
+++ b/pkg/front_end/testcases/records/issue50182.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Hello<unrelated T extends core::Object? = dynamic> = (T%, {required name: T%});
+typedef Hello<T extends core::Object? = dynamic> = (T%, {required name: T%});
 class MyClass<T extends core::Object? = dynamic> extends core::Object {
   final field () → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField;
   constructor •(() → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField) → self::MyClass<self::MyClass::T%>
diff --git a/pkg/front_end/testcases/records/issue50182.dart.weak.modular.expect b/pkg/front_end/testcases/records/issue50182.dart.weak.modular.expect
index aec4e08..3e502c4 100644
--- a/pkg/front_end/testcases/records/issue50182.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/records/issue50182.dart.weak.modular.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Hello<unrelated T extends core::Object? = dynamic> = (T%, {required name: T%});
+typedef Hello<T extends core::Object? = dynamic> = (T%, {required name: T%});
 class MyClass<T extends core::Object? = dynamic> extends core::Object {
   final field () → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField;
   constructor •(() → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField) → self::MyClass<self::MyClass::T%>
diff --git a/pkg/front_end/testcases/records/issue50182.dart.weak.outline.expect b/pkg/front_end/testcases/records/issue50182.dart.weak.outline.expect
index 046d435..bfcb91e 100644
--- a/pkg/front_end/testcases/records/issue50182.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/records/issue50182.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Hello<unrelated T extends core::Object? = dynamic> = (T%, {required name: T%});
+typedef Hello<T extends core::Object? = dynamic> = (T%, {required name: T%});
 class MyClass<T extends core::Object? = dynamic> extends core::Object {
   final field () → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField;
   constructor •(() → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField) → self::MyClass<self::MyClass::T%>
diff --git a/pkg/front_end/testcases/records/issue50182.dart.weak.transformed.expect b/pkg/front_end/testcases/records/issue50182.dart.weak.transformed.expect
index 85bd7f3..01b4cac 100644
--- a/pkg/front_end/testcases/records/issue50182.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/records/issue50182.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Hello<unrelated T extends core::Object? = dynamic> = (T%, {required name: T%});
+typedef Hello<T extends core::Object? = dynamic> = (T%, {required name: T%});
 class MyClass<T extends core::Object? = dynamic> extends core::Object {
   final field () → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField;
   constructor •(() → self::Value<(self::MyClass::T%, {required name: self::MyClass::T%})>? myField) → self::MyClass<self::MyClass::T%>
diff --git a/pkg/front_end/testcases/records/issue51940.dart.strong.expect b/pkg/front_end/testcases/records/issue51940.dart.strong.expect
index e7f616c..676b9ba 100644
--- a/pkg/front_end/testcases/records/issue51940.dart.strong.expect
+++ b/pkg/front_end/testcases/records/issue51940.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Parser<unrelated T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
+typedef Parser<T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
 abstract sealed class Result<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::Result<self::Result::T%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/records/issue51940.dart.strong.transformed.expect b/pkg/front_end/testcases/records/issue51940.dart.strong.transformed.expect
index e7f616c..676b9ba 100644
--- a/pkg/front_end/testcases/records/issue51940.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/records/issue51940.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Parser<unrelated T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
+typedef Parser<T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
 abstract sealed class Result<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::Result<self::Result::T%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/records/issue51940.dart.weak.expect b/pkg/front_end/testcases/records/issue51940.dart.weak.expect
index 0b8b49e..340195e 100644
--- a/pkg/front_end/testcases/records/issue51940.dart.weak.expect
+++ b/pkg/front_end/testcases/records/issue51940.dart.weak.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-typedef Parser<unrelated T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
+typedef Parser<T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
 abstract sealed class Result<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::Result<self::Result::T%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/records/issue51940.dart.weak.modular.expect b/pkg/front_end/testcases/records/issue51940.dart.weak.modular.expect
index 0b8b49e..340195e 100644
--- a/pkg/front_end/testcases/records/issue51940.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/records/issue51940.dart.weak.modular.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-typedef Parser<unrelated T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
+typedef Parser<T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
 abstract sealed class Result<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::Result<self::Result::T%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/records/issue51940.dart.weak.outline.expect b/pkg/front_end/testcases/records/issue51940.dart.weak.outline.expect
index af1741f..1425b8a 100644
--- a/pkg/front_end/testcases/records/issue51940.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/records/issue51940.dart.weak.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Parser<unrelated T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
+typedef Parser<T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
 abstract sealed class Result<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::Result<self::Result::T%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/records/issue51940.dart.weak.transformed.expect b/pkg/front_end/testcases/records/issue51940.dart.weak.transformed.expect
index 0b8b49e..340195e 100644
--- a/pkg/front_end/testcases/records/issue51940.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/records/issue51940.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-typedef Parser<unrelated T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
+typedef Parser<T extends core::Object? = dynamic> = (core::String) → (self::Result<T%>, core::String);
 abstract sealed class Result<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
   const constructor •() → self::Result<self::Result::T%>
     : super core::Object::•()
diff --git a/pkg/front_end/testcases/records/variance.dart b/pkg/front_end/testcases/records/variance.dart
new file mode 100644
index 0000000..4388d2d
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef A<T> = (String, int);
+typedef B<T> = (T, int);
+typedef C<T> = ({T a, int b});
+typedef D<T> = (T, T);
+typedef E<T> = (void Function(T), int);
+typedef F<T> = ({void Function(T) a, int b});
+typedef G<T> = (void Function(T), T);
+typedef H<T> = (void Function(T), {T b});
diff --git a/pkg/front_end/testcases/records/variance.dart.strong.expect b/pkg/front_end/testcases/records/variance.dart.strong.expect
new file mode 100644
index 0000000..4de9aa5
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.strong.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated T extends core::Object? = dynamic> = (core::String, core::int);
+typedef B<T extends core::Object? = dynamic> = (T%, core::int);
+typedef C<T extends core::Object? = dynamic> = ({required a: T%, required b: core::int});
+typedef D<T extends core::Object? = dynamic> = (T%, T%);
+typedef E<contravariant T extends core::Object? = dynamic> = ((T%) → void, core::int);
+typedef F<contravariant T extends core::Object? = dynamic> = ({required a: (T%) → void, required b: core::int});
+typedef G<invariant T extends core::Object? = dynamic> = ((T%) → void, T%);
+typedef H<invariant T extends core::Object? = dynamic> = ((T%) → void, {required b: T%});
diff --git a/pkg/front_end/testcases/records/variance.dart.strong.transformed.expect b/pkg/front_end/testcases/records/variance.dart.strong.transformed.expect
new file mode 100644
index 0000000..4de9aa5
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.strong.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated T extends core::Object? = dynamic> = (core::String, core::int);
+typedef B<T extends core::Object? = dynamic> = (T%, core::int);
+typedef C<T extends core::Object? = dynamic> = ({required a: T%, required b: core::int});
+typedef D<T extends core::Object? = dynamic> = (T%, T%);
+typedef E<contravariant T extends core::Object? = dynamic> = ((T%) → void, core::int);
+typedef F<contravariant T extends core::Object? = dynamic> = ({required a: (T%) → void, required b: core::int});
+typedef G<invariant T extends core::Object? = dynamic> = ((T%) → void, T%);
+typedef H<invariant T extends core::Object? = dynamic> = ((T%) → void, {required b: T%});
diff --git a/pkg/front_end/testcases/records/variance.dart.textual_outline.expect b/pkg/front_end/testcases/records/variance.dart.textual_outline.expect
new file mode 100644
index 0000000..aa38e10
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+typedef A<T> = (String, int);
+typedef B<T> = (T, int);
+typedef C<T> = ({T a, int b});
+typedef D<T> = (T, T);
+typedef E<T> = (void Function(T), int);
+typedef F<T> = ({void Function(T) a, int b});
+typedef G<T> = (void Function(T), T);
+typedef H<T> = (void Function(T), {T b});
diff --git a/pkg/front_end/testcases/records/variance.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/records/variance.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..aa38e10
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+typedef A<T> = (String, int);
+typedef B<T> = (T, int);
+typedef C<T> = ({T a, int b});
+typedef D<T> = (T, T);
+typedef E<T> = (void Function(T), int);
+typedef F<T> = ({void Function(T) a, int b});
+typedef G<T> = (void Function(T), T);
+typedef H<T> = (void Function(T), {T b});
diff --git a/pkg/front_end/testcases/records/variance.dart.weak.expect b/pkg/front_end/testcases/records/variance.dart.weak.expect
new file mode 100644
index 0000000..4de9aa5
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.weak.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated T extends core::Object? = dynamic> = (core::String, core::int);
+typedef B<T extends core::Object? = dynamic> = (T%, core::int);
+typedef C<T extends core::Object? = dynamic> = ({required a: T%, required b: core::int});
+typedef D<T extends core::Object? = dynamic> = (T%, T%);
+typedef E<contravariant T extends core::Object? = dynamic> = ((T%) → void, core::int);
+typedef F<contravariant T extends core::Object? = dynamic> = ({required a: (T%) → void, required b: core::int});
+typedef G<invariant T extends core::Object? = dynamic> = ((T%) → void, T%);
+typedef H<invariant T extends core::Object? = dynamic> = ((T%) → void, {required b: T%});
diff --git a/pkg/front_end/testcases/records/variance.dart.weak.modular.expect b/pkg/front_end/testcases/records/variance.dart.weak.modular.expect
new file mode 100644
index 0000000..4de9aa5
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated T extends core::Object? = dynamic> = (core::String, core::int);
+typedef B<T extends core::Object? = dynamic> = (T%, core::int);
+typedef C<T extends core::Object? = dynamic> = ({required a: T%, required b: core::int});
+typedef D<T extends core::Object? = dynamic> = (T%, T%);
+typedef E<contravariant T extends core::Object? = dynamic> = ((T%) → void, core::int);
+typedef F<contravariant T extends core::Object? = dynamic> = ({required a: (T%) → void, required b: core::int});
+typedef G<invariant T extends core::Object? = dynamic> = ((T%) → void, T%);
+typedef H<invariant T extends core::Object? = dynamic> = ((T%) → void, {required b: T%});
diff --git a/pkg/front_end/testcases/records/variance.dart.weak.outline.expect b/pkg/front_end/testcases/records/variance.dart.weak.outline.expect
new file mode 100644
index 0000000..4de9aa5
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.weak.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated T extends core::Object? = dynamic> = (core::String, core::int);
+typedef B<T extends core::Object? = dynamic> = (T%, core::int);
+typedef C<T extends core::Object? = dynamic> = ({required a: T%, required b: core::int});
+typedef D<T extends core::Object? = dynamic> = (T%, T%);
+typedef E<contravariant T extends core::Object? = dynamic> = ((T%) → void, core::int);
+typedef F<contravariant T extends core::Object? = dynamic> = ({required a: (T%) → void, required b: core::int});
+typedef G<invariant T extends core::Object? = dynamic> = ((T%) → void, T%);
+typedef H<invariant T extends core::Object? = dynamic> = ((T%) → void, {required b: T%});
diff --git a/pkg/front_end/testcases/records/variance.dart.weak.transformed.expect b/pkg/front_end/testcases/records/variance.dart.weak.transformed.expect
new file mode 100644
index 0000000..4de9aa5
--- /dev/null
+++ b/pkg/front_end/testcases/records/variance.dart.weak.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated T extends core::Object? = dynamic> = (core::String, core::int);
+typedef B<T extends core::Object? = dynamic> = (T%, core::int);
+typedef C<T extends core::Object? = dynamic> = ({required a: T%, required b: core::int});
+typedef D<T extends core::Object? = dynamic> = (T%, T%);
+typedef E<contravariant T extends core::Object? = dynamic> = ((T%) → void, core::int);
+typedef F<contravariant T extends core::Object? = dynamic> = ({required a: (T%) → void, required b: core::int});
+typedef G<invariant T extends core::Object? = dynamic> = ((T%) → void, T%);
+typedef H<invariant T extends core::Object? = dynamic> = ((T%) → void, {required b: T%});