Version 2.18.0-126.0.dev

Merge commit 'd9152974edc3a04ff706db50bf721e2701acbd53' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a3cc15..b412795 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -39,7 +39,19 @@
   It can still be created with the `--legacy-packages-file` flag.
 * `dart pub outdated` now shows which of your dependencies are discontinued.
 
-## 2.17.0
+## 2.17.1 - 2022-05-18
+
+This is a patch release that fixes:
+
+- an analyzer plugin crash (issue [#48682][]).
+- Dart FFI support for `late` `Finalizable` variables (issue [#49024]).
+- `dart compile` on macOS 10.15 (issue [#49010][]).
+
+[#48682]: https://github.com/dart-lang/sdk/issues/48682
+[#49024]: https://github.com/dart-lang/sdk/issues/49024
+[#49010]: https://github.com/dart-lang/sdk/issues/49010
+
+## 2.17.0 - 2022-05-11
 
 ### Language
 
diff --git a/DEPS b/DEPS
index 1a1424f1..793556f 100644
--- a/DEPS
+++ b/DEPS
@@ -42,8 +42,7 @@
   "sdk_tag": "version:2.17.0",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
-  # hashes. It requires access to the dart-build-access group, which EngProd
-  # has.
+  # hashes.
   "co19_rev": "9849573cd1b8317e58247b8c1672e89b1cd842e2",
   # This line prevents conflicts when both packages are rolled simultaneously.
   "co19_2_rev": "b2034a17609472e374623f3dbe0efd9f5cb258af",
@@ -109,7 +108,7 @@
 
   "dartdoc_rev": "334072b0cad436c05f6bcecf8a1a59f2f0809b84",
   "devtools_rev": "3c16b8d73120e46958982d94215d499793b972eb",
-  "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
+  "ffi_rev": "0c8364a728cfe4e4ba859c53b99d56b3dbe3add4",
   "file_rev": "0132eeedea2933513bf230513a766a8baeab0c4f",
   "fixnum_rev": "3bfc2ed1eea7e7acb79ad4f17392f92c816fc5ce",
   "glob_rev": "e10eb2407c58427144004458ef85c9bbf7286e56",
diff --git a/pkg/_fe_analyzer_shared/benchmark/exhaustiveness/large_fields_call_counts.dart b/pkg/_fe_analyzer_shared/benchmark/exhaustiveness/large_fields_call_counts.dart
new file mode 100644
index 0000000..ec1695f
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/benchmark/exhaustiveness/large_fields_call_counts.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/exhaustive.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/profile.dart' as profile;
+import 'package:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+
+import '../../test/exhaustiveness/utils.dart';
+
+void main() {
+  profile.enabled = true;
+
+  //   (A)
+  //   /|\
+  //  B C D
+  var a = StaticType('A', isSealed: true);
+  var b = StaticType('B', inherits: [a]);
+  var c = StaticType('C', inherits: [a]);
+  var d = StaticType('D', inherits: [a]);
+  var t = StaticType('T', fields: {'w': a, 'x': a, 'y': a, 'z': a});
+
+  expectExhaustiveOnlyAll(t, [
+    {'w': b, 'x': b, 'y': b, 'z': b},
+    {'w': b, 'x': b, 'y': b, 'z': c},
+    {'w': b, 'x': b, 'y': b, 'z': d},
+    {'w': b, 'x': b, 'y': c, 'z': b},
+    {'w': b, 'x': b, 'y': c, 'z': c},
+    {'w': b, 'x': b, 'y': c, 'z': d},
+    {'w': b, 'x': b, 'y': d, 'z': b},
+    {'w': b, 'x': b, 'y': d, 'z': c},
+    {'w': b, 'x': b, 'y': d, 'z': d},
+    {'w': b, 'x': c, 'y': b, 'z': b},
+    {'w': b, 'x': c, 'y': b, 'z': c},
+    {'w': b, 'x': c, 'y': b, 'z': d},
+    {'w': b, 'x': c, 'y': c, 'z': b},
+    {'w': b, 'x': c, 'y': c, 'z': c},
+    {'w': b, 'x': c, 'y': c, 'z': d},
+    {'w': b, 'x': c, 'y': d, 'z': b},
+    {'w': b, 'x': c, 'y': d, 'z': c},
+    {'w': b, 'x': c, 'y': d, 'z': d},
+    {'w': b, 'x': d, 'y': b, 'z': b},
+    {'w': b, 'x': d, 'y': b, 'z': c},
+    {'w': b, 'x': d, 'y': b, 'z': d},
+    {'w': b, 'x': d, 'y': c, 'z': b},
+    {'w': b, 'x': d, 'y': c, 'z': c},
+    {'w': b, 'x': d, 'y': c, 'z': d},
+    {'w': b, 'x': d, 'y': d, 'z': b},
+    {'w': b, 'x': d, 'y': d, 'z': c},
+    {'w': b, 'x': d, 'y': d, 'z': d},
+    {'w': c, 'x': b, 'y': b, 'z': b},
+    {'w': c, 'x': b, 'y': b, 'z': c},
+    {'w': c, 'x': b, 'y': b, 'z': d},
+    {'w': c, 'x': b, 'y': c, 'z': b},
+    {'w': c, 'x': b, 'y': c, 'z': c},
+    {'w': c, 'x': b, 'y': c, 'z': d},
+    {'w': c, 'x': b, 'y': d, 'z': b},
+    {'w': c, 'x': b, 'y': d, 'z': c},
+    {'w': c, 'x': b, 'y': d, 'z': d},
+    {'w': c, 'x': c, 'y': b, 'z': b},
+    {'w': c, 'x': c, 'y': b, 'z': c},
+    {'w': c, 'x': c, 'y': b, 'z': d},
+    {'w': c, 'x': c, 'y': c, 'z': b},
+    {'w': c, 'x': c, 'y': c, 'z': c},
+    {'w': c, 'x': c, 'y': c, 'z': d},
+    {'w': c, 'x': c, 'y': d, 'z': b},
+    {'w': c, 'x': c, 'y': d, 'z': c},
+    {'w': c, 'x': c, 'y': d, 'z': d},
+    {'w': c, 'x': d, 'y': b, 'z': b},
+    {'w': c, 'x': d, 'y': b, 'z': c},
+    {'w': c, 'x': d, 'y': b, 'z': d},
+    {'w': c, 'x': d, 'y': c, 'z': b},
+    {'w': c, 'x': d, 'y': c, 'z': c},
+    {'w': c, 'x': d, 'y': c, 'z': d},
+    {'w': c, 'x': d, 'y': d, 'z': b},
+    {'w': c, 'x': d, 'y': d, 'z': c},
+    {'w': c, 'x': d, 'y': d, 'z': d},
+    {'w': d, 'x': b, 'y': b, 'z': b},
+    {'w': d, 'x': b, 'y': b, 'z': c},
+    {'w': d, 'x': b, 'y': b, 'z': d},
+    {'w': d, 'x': b, 'y': c, 'z': b},
+    {'w': d, 'x': b, 'y': c, 'z': c},
+    {'w': d, 'x': b, 'y': c, 'z': d},
+    {'w': d, 'x': b, 'y': d, 'z': b},
+    {'w': d, 'x': b, 'y': d, 'z': c},
+    {'w': d, 'x': b, 'y': d, 'z': d},
+    {'w': d, 'x': c, 'y': b, 'z': b},
+    {'w': d, 'x': c, 'y': b, 'z': c},
+    {'w': d, 'x': c, 'y': b, 'z': d},
+    {'w': d, 'x': c, 'y': c, 'z': b},
+    {'w': d, 'x': c, 'y': c, 'z': c},
+    {'w': d, 'x': c, 'y': c, 'z': d},
+    {'w': d, 'x': c, 'y': d, 'z': b},
+    {'w': d, 'x': c, 'y': d, 'z': c},
+    {'w': d, 'x': c, 'y': d, 'z': d},
+    {'w': d, 'x': d, 'y': b, 'z': b},
+    {'w': d, 'x': d, 'y': b, 'z': c},
+    {'w': d, 'x': d, 'y': b, 'z': d},
+    {'w': d, 'x': d, 'y': c, 'z': b},
+    {'w': d, 'x': d, 'y': c, 'z': c},
+    {'w': d, 'x': d, 'y': c, 'z': d},
+    {'w': d, 'x': d, 'y': d, 'z': b},
+    {'w': d, 'x': d, 'y': d, 'z': c},
+    {'w': d, 'x': d, 'y': d, 'z': d},
+  ]);
+}
+
+/// Test that [cases] are exhaustive over [type] if and only if all cases are
+/// included and that all subsets of the cases are not exhaustive.
+void expectExhaustiveOnlyAll(StaticType type, List<Object> cases) {
+  var spaces = parseSpaces(cases);
+  profile.reset();
+  print(isExhaustive(Space(type), spaces));
+  profile.log();
+}
diff --git a/pkg/_fe_analyzer_shared/benchmark/exhaustiveness/large_fields_timed.dart b/pkg/_fe_analyzer_shared/benchmark/exhaustiveness/large_fields_timed.dart
new file mode 100644
index 0000000..ae2b282
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/benchmark/exhaustiveness/large_fields_timed.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math';
+
+import 'package:_fe_analyzer_shared/src/exhaustiveness/exhaustive.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+
+import '../../test/exhaustiveness/utils.dart';
+
+void main() {
+  //   (A)
+  //   /|\
+  //  B C D
+  var a = StaticType('A', isSealed: true);
+  var b = StaticType('B', inherits: [a]);
+  var c = StaticType('C', inherits: [a]);
+  var d = StaticType('D', inherits: [a]);
+  var t = StaticType('T', fields: {'w': a, 'x': a, 'y': a, 'z': a});
+
+  expectExhaustiveOnlyAll(t, [
+    {'w': b, 'x': b, 'y': b, 'z': b},
+    {'w': b, 'x': b, 'y': b, 'z': c},
+    {'w': b, 'x': b, 'y': b, 'z': d},
+    {'w': b, 'x': b, 'y': c, 'z': b},
+    {'w': b, 'x': b, 'y': c, 'z': c},
+    {'w': b, 'x': b, 'y': c, 'z': d},
+    {'w': b, 'x': b, 'y': d, 'z': b},
+    {'w': b, 'x': b, 'y': d, 'z': c},
+    {'w': b, 'x': b, 'y': d, 'z': d},
+    {'w': b, 'x': c, 'y': b, 'z': b},
+    {'w': b, 'x': c, 'y': b, 'z': c},
+    {'w': b, 'x': c, 'y': b, 'z': d},
+    {'w': b, 'x': c, 'y': c, 'z': b},
+    {'w': b, 'x': c, 'y': c, 'z': c},
+    {'w': b, 'x': c, 'y': c, 'z': d},
+    {'w': b, 'x': c, 'y': d, 'z': b},
+    {'w': b, 'x': c, 'y': d, 'z': c},
+    {'w': b, 'x': c, 'y': d, 'z': d},
+    {'w': b, 'x': d, 'y': b, 'z': b},
+    {'w': b, 'x': d, 'y': b, 'z': c},
+    {'w': b, 'x': d, 'y': b, 'z': d},
+    {'w': b, 'x': d, 'y': c, 'z': b},
+    {'w': b, 'x': d, 'y': c, 'z': c},
+    {'w': b, 'x': d, 'y': c, 'z': d},
+    {'w': b, 'x': d, 'y': d, 'z': b},
+    {'w': b, 'x': d, 'y': d, 'z': c},
+    {'w': b, 'x': d, 'y': d, 'z': d},
+    {'w': c, 'x': b, 'y': b, 'z': b},
+    {'w': c, 'x': b, 'y': b, 'z': c},
+    {'w': c, 'x': b, 'y': b, 'z': d},
+    {'w': c, 'x': b, 'y': c, 'z': b},
+    {'w': c, 'x': b, 'y': c, 'z': c},
+    {'w': c, 'x': b, 'y': c, 'z': d},
+    {'w': c, 'x': b, 'y': d, 'z': b},
+    {'w': c, 'x': b, 'y': d, 'z': c},
+    {'w': c, 'x': b, 'y': d, 'z': d},
+    {'w': c, 'x': c, 'y': b, 'z': b},
+    {'w': c, 'x': c, 'y': b, 'z': c},
+    {'w': c, 'x': c, 'y': b, 'z': d},
+    {'w': c, 'x': c, 'y': c, 'z': b},
+    {'w': c, 'x': c, 'y': c, 'z': c},
+    {'w': c, 'x': c, 'y': c, 'z': d},
+    {'w': c, 'x': c, 'y': d, 'z': b},
+    {'w': c, 'x': c, 'y': d, 'z': c},
+    {'w': c, 'x': c, 'y': d, 'z': d},
+    {'w': c, 'x': d, 'y': b, 'z': b},
+    {'w': c, 'x': d, 'y': b, 'z': c},
+    {'w': c, 'x': d, 'y': b, 'z': d},
+    {'w': c, 'x': d, 'y': c, 'z': b},
+    {'w': c, 'x': d, 'y': c, 'z': c},
+    {'w': c, 'x': d, 'y': c, 'z': d},
+    {'w': c, 'x': d, 'y': d, 'z': b},
+    {'w': c, 'x': d, 'y': d, 'z': c},
+    {'w': c, 'x': d, 'y': d, 'z': d},
+    {'w': d, 'x': b, 'y': b, 'z': b},
+    {'w': d, 'x': b, 'y': b, 'z': c},
+    {'w': d, 'x': b, 'y': b, 'z': d},
+    {'w': d, 'x': b, 'y': c, 'z': b},
+    {'w': d, 'x': b, 'y': c, 'z': c},
+    {'w': d, 'x': b, 'y': c, 'z': d},
+    {'w': d, 'x': b, 'y': d, 'z': b},
+    {'w': d, 'x': b, 'y': d, 'z': c},
+    {'w': d, 'x': b, 'y': d, 'z': d},
+    {'w': d, 'x': c, 'y': b, 'z': b},
+    {'w': d, 'x': c, 'y': b, 'z': c},
+    {'w': d, 'x': c, 'y': b, 'z': d},
+    {'w': d, 'x': c, 'y': c, 'z': b},
+    {'w': d, 'x': c, 'y': c, 'z': c},
+    {'w': d, 'x': c, 'y': c, 'z': d},
+    {'w': d, 'x': c, 'y': d, 'z': b},
+    {'w': d, 'x': c, 'y': d, 'z': c},
+    {'w': d, 'x': c, 'y': d, 'z': d},
+    {'w': d, 'x': d, 'y': b, 'z': b},
+    {'w': d, 'x': d, 'y': b, 'z': c},
+    {'w': d, 'x': d, 'y': b, 'z': d},
+    {'w': d, 'x': d, 'y': c, 'z': b},
+    {'w': d, 'x': d, 'y': c, 'z': c},
+    {'w': d, 'x': d, 'y': c, 'z': d},
+    {'w': d, 'x': d, 'y': d, 'z': b},
+    {'w': d, 'x': d, 'y': d, 'z': c},
+    {'w': d, 'x': d, 'y': d, 'z': d},
+  ]);
+}
+
+/// Test that [cases] are exhaustive over [type] if and only if all cases are
+/// included and that all subsets of the cases are not exhaustive.
+void expectExhaustiveOnlyAll(StaticType type, List<Object> cases) {
+  const trials = 100;
+
+  var best = 9999999;
+  for (var j = 0; j < 100000; j++) {
+    var watch = Stopwatch()..start();
+    for (var i = 0; i < trials; i++) {
+      var spaces = parseSpaces(cases);
+      var actual = isExhaustive(Space(type), spaces);
+      if (!actual) {
+        throw 'Expected exhaustive';
+      }
+    }
+
+    var elapsed = watch.elapsedMilliseconds;
+    best = min(elapsed, best);
+    print('${elapsed / trials}ms (best ${best / trials}ms)');
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/equal.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/equal.dart
new file mode 100644
index 0000000..63f527d
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/equal.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2022, 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 'profile.dart' as profile;
+import 'space.dart';
+
+/// Returns `true` if [left] and [right] are equivalent spaces.
+///
+/// Equality is defined purely structurally/syntactically.
+bool equal(Space left, Space right, String reason) {
+  profile.count('equal', reason);
+
+  if (identical(left, right)) return true;
+
+  // Empty is only equal to itself (and will get caught by the previous check).
+  if (left == Space.empty) return false;
+  if (right == Space.empty) return false;
+
+  if (left is UnionSpace && right is UnionSpace) {
+    return _equalUnions(left, right);
+  }
+
+  if (left is ExtractSpace && right is ExtractSpace) {
+    return _equalExtracts(left, right);
+  }
+
+  // If we get here, one is a union and one is an extract.
+  return false;
+}
+
+/// Returns `true` if [left] and [right] have the same type and the same fields
+/// with equal subspaces.
+bool _equalExtracts(ExtractSpace left, ExtractSpace right) {
+  // Must have the same type.
+  if (left.type != right.type) return false;
+
+  // And the same fields.
+  Set<String> fields = {...left.fields.keys, ...right.fields.keys};
+  if (left.fields.length != fields.length) return false;
+  if (right.fields.length != fields.length) return false;
+
+  for (String field in fields) {
+    if (!equal(left.fields[field]!, right.fields[field]!, 'recurse extract')) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+/// Returns `true` if [left] and [right] contain equal arms in any order.
+///
+/// Assumes that all duplicates have already been removed from each union.
+bool _equalUnions(UnionSpace left, UnionSpace right) {
+  if (left.arms.length != right.arms.length) return false;
+
+  /// For each left arm, should find an equal right arm.
+  for (Space leftArm in left.arms) {
+    bool found = false;
+    for (Space rightArm in right.arms) {
+      if (equal(leftArm, rightArm, 'recurse union')) {
+        found = true;
+        break;
+      }
+    }
+    if (!found) return false;
+  }
+
+  return true;
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/exhaustive.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/exhaustive.dart
new file mode 100644
index 0000000..17fbf9f
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/exhaustive.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2022, 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 'space.dart';
+import 'static_type.dart';
+import 'subtract.dart';
+
+/// Returns `true` if [cases] exhaustively covers all possible values of
+/// [value].
+///
+/// This is defined simply in terms of subtraction and unions: [cases] is a
+/// union space, and it's exhaustive if subtracting it from [value] leaves
+/// nothing.
+bool isExhaustive(Space value, List<Space> cases) {
+  return subtract(value, new Space.union(cases)) == Space.empty;
+}
+
+/// Checks the [cases] representing a series of switch cases to see if they
+/// exhaustively cover all possible values of the matched [valueType]. Also
+/// checks to see if any case can't be matched because it's covered by previous
+/// cases.
+///
+/// Returns a string containing any unreachable case or non-exhaustive match
+/// errors. Returns an empty string if all cases are reachable and the cases
+/// are exhaustive.
+String reportErrors(StaticType valueType, List<Space> cases) {
+  List<String> errors = <String>[];
+
+  Space remaining = new Space(valueType);
+  for (int i = 0; i < cases.length; i++) {
+    // See if this case is covered by previous ones.
+    if (i > 0) {
+      Space previous = new Space.union(cases.sublist(0, i));
+      if (subtract(cases[i], previous) == Space.empty) {
+        errors.add('Case #${i + 1} ${cases[i]} is covered by $previous.');
+      }
+    }
+
+    remaining = subtract(remaining, cases[i]);
+  }
+
+  if (remaining != Space.empty) {
+    errors.add(
+        '$valueType is not exhaustively matched by ${new Space.union(cases)}.');
+  }
+
+  return errors.join('\n');
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/intersect.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/intersect.dart
new file mode 100644
index 0000000..e710c60
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/intersect.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2022, 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 'profile.dart' as profile;
+import 'space.dart';
+import 'static_type.dart';
+
+/// Calculates the intersection of [left] and [right].
+///
+/// This is used to tell if two field spaces on a pair of spaces being
+/// subtracted have no common values.
+Space intersect(Space left, Space right) {
+  profile.count('intersect');
+
+  // The intersection with an empty space is always empty.
+  if (left == Space.empty) return Space.empty;
+  if (right == Space.empty) return Space.empty;
+
+  // The intersection of a union is the union of the intersections of its arms.
+  if (left is UnionSpace) {
+    return new Space.union(
+        left.arms.map((arm) => intersect(arm, right)).toList());
+  }
+
+  if (right is UnionSpace) {
+    return new Space.union(
+        right.arms.map((arm) => intersect(left, arm)).toList());
+  }
+
+  // Otherwise, we're intersecting two [ExtractSpaces].
+  return _intersectExtracts(left as ExtractSpace, right as ExtractSpace);
+}
+
+/// Returns the intersection of two static types [left] and [right].
+///
+/// Returns `null` if the intersection is empty.
+StaticType? intersectTypes(StaticType left, StaticType right) {
+  // If one type is a subtype, the subtype is the intersection.
+  if (left.isSubtypeOf(right)) return left;
+  if (right.isSubtypeOf(left)) return right;
+
+  if (left.isNullable) {
+    if (right.isNullable) {
+      StaticType? intersection =
+          intersectTypes(left.underlying, right.underlying);
+      if (intersection == null) return null;
+      return intersection.nullable;
+    } else {
+      return intersectTypes(left.underlying, right);
+    }
+  } else if (right.isNullable) {
+    return intersectTypes(left, right.underlying);
+  }
+
+  // If we allow sealed types to share subtypes, then this will need to be more
+  // sophisticated. Here:
+  //
+  //   (A) (B)
+  //   / \ / \
+  //  C   D   E
+  //
+  // The intersection of A and B should be D. Here:
+  //
+  //  (A)   (B)
+  //   | \  / |
+  //   |\ \/ /|
+  //   | \/\/ |
+  //   C D  E F
+  //
+  // It should be D, E.
+
+  // Unrelated types.
+  return null;
+}
+
+/// Returns the interaction of extract spaces [left] and [right].
+Space _intersectExtracts(ExtractSpace left, ExtractSpace right) {
+  StaticType? type = intersectTypes(left.type, right.type);
+
+  // If the types are disjoint, the intersection is empty.
+  if (type == null) return Space.empty;
+
+  // Recursively intersect the fields.
+  List<String> fieldNames =
+      {...left.fields.keys, ...right.fields.keys}.toList();
+
+  // Sorting isn't needed for correctness, just to make the tests less brittle.
+  fieldNames.sort();
+
+  Map<String, Space> fields = <String, Space>{};
+  for (String name in fieldNames) {
+    Space field = _intersectFields(left.fields[name], right.fields[name]);
+
+    // If the fields are disjoint, then the entire space will have no values.
+    if (field == Space.empty) return Space.empty;
+    fields[name] = field;
+  }
+
+  return new Space(type, fields);
+}
+
+Space _intersectFields(Space? left, Space? right) {
+  if (left == null) return right!;
+  if (right == null) return left;
+  return intersect(left, right);
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/intersect_empty.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/intersect_empty.dart
new file mode 100644
index 0000000..2baa029
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/intersect_empty.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2022, 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 'space.dart';
+import 'static_type.dart';
+
+/// Calculates whether the intersection of [left] and [right] is empty.
+///
+/// This is used to tell if two field spaces on a pair of spaces being
+/// subtracted have no common values.
+bool intersectEmpty(Space left, Space right) {
+  // The intersection with an empty space is always empty.
+  if (left == Space.empty) return true;
+  if (right == Space.empty) return true;
+
+  // The intersection of a union is empty if all of the arms are.
+  if (left is UnionSpace) {
+    return left.arms.every((arm) => intersectEmpty(arm, right));
+  }
+
+  if (right is UnionSpace) {
+    return right.arms.every((arm) => intersectEmpty(left, arm));
+  }
+
+  // Otherwise, we're intersecting two [ExtractSpaces].
+  return _intersectExtracts(left as ExtractSpace, right as ExtractSpace);
+}
+
+/// Returns true if the intersection of two static types [left] and [right] is
+/// empty.
+bool intersectTypes(StaticType left, StaticType right) {
+  // If one type is a subtype, the subtype is the intersection.
+  if (left.isSubtypeOf(right)) return false;
+  if (right.isSubtypeOf(left)) return false;
+
+  // Unrelated types.
+  return true;
+}
+
+/// Returns the interaction of extract spaces [left] and [right].
+bool _intersectExtracts(ExtractSpace left, ExtractSpace right) {
+  if (intersectTypes(left.type, right.type)) return true;
+
+  // Recursively intersect the fields.
+  List<String> fieldNames =
+      {...left.fields.keys, ...right.fields.keys}.toList();
+  for (String name in fieldNames) {
+    // If the fields are disjoint, then the entire space will have no values.
+    if (_intersectFields(left.fields[name], right.fields[name])) return true;
+  }
+
+  return false;
+}
+
+bool _intersectFields(Space? left, Space? right) {
+  if (left == null) return right! == Space.empty;
+  if (right == null) return left == Space.empty;
+  return intersectEmpty(left, right);
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/profile.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/profile.dart
new file mode 100644
index 0000000..694b568
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/profile.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math';
+
+bool enabled = false;
+
+final _counts = <String, int>{};
+
+void count(String name, [String? subname]) {
+  if (!enabled) return;
+  _counts.putIfAbsent(name, () => 0);
+  _counts[name] = _counts[name]! + 1;
+
+  if (subname != null) {
+    count('$name/$subname');
+  }
+}
+
+void log() {
+  List<String> names = _counts.keys.toList();
+  names.sort();
+  int nameLength =
+      names.fold<int>(0, (length, name) => max(length, name.length));
+  int countLength = _counts.values
+      .fold<int>(0, (length, count) => max(length, count.toString().length));
+
+  for (String name in names) {
+    print('${name.padRight(nameLength)} = '
+        '${_counts[name].toString().padLeft(countLength)}');
+  }
+}
+
+void reset() {
+  _counts.clear();
+}
+
+void run(void Function() callback) {
+  reset();
+  try {
+    callback();
+  } finally {
+    log();
+    reset();
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/space.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/space.dart
new file mode 100644
index 0000000..fe14656
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/space.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2022, 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 'equal.dart';
+import 'static_type.dart';
+
+/// The main space for matching types and destructuring.
+///
+/// It has a type which determines the type of values it contains. The type may
+/// be [StaticType.top] to indicate that it doesn't filter by type.
+///
+/// It may also contain zero or more named fields. The space then only contains
+/// values where the field values are contained by the corresponding field
+/// spaces.
+class ExtractSpace extends Space {
+  /// The type of values the space matches.
+  final StaticType type;
+
+  /// Any field subspaces the space matches.
+  final Map<String, Space> fields;
+
+  ExtractSpace._(this.type, [this.fields = const {}]) : super._();
+
+  /// An [ExtractSpace] with no type and no fields contains all values.
+  @override
+  bool get isTop => type == StaticType.top && fields.isEmpty;
+
+  @override
+  String toString() {
+    if (isTop) return '()';
+
+    // If there are no fields, just show the type.
+    if (fields.isEmpty) return type.name;
+
+    StringBuffer buffer = new StringBuffer();
+
+    // We model a bare record pattern by treating it like an extractor on top.
+    if (type != StaticType.top) buffer.write(type.name);
+
+    buffer.write('(');
+    bool first = true;
+
+    // Positional fields have stringified number names.
+    for (int i = 0;; i++) {
+      Space? pattern = fields[i.toString()];
+      if (pattern == null) break;
+
+      if (!first) buffer.write(', ');
+      buffer.write(pattern);
+      first = false;
+    }
+
+    fields.forEach((name, pattern) {
+      // Skip positional fields.
+      if (int.tryParse(name) != null) return;
+
+      if (!first) buffer.write(', ');
+      buffer.write('$name: $pattern');
+      first = false;
+    });
+
+    buffer.write(')');
+
+    return buffer.toString();
+  }
+}
+
+// TODO(paulberry, rnystrom): List spaces.
+
+abstract class Space {
+  static final _EmptySpace empty = new _EmptySpace._();
+  static final Space top = new Space(StaticType.top);
+
+  factory Space(StaticType type, [Map<String, Space> fields = const {}]) =>
+      new ExtractSpace._(type, fields);
+
+  factory Space.record([Map<String, Space> fields = const {}]) =>
+      new Space(StaticType.top, fields);
+
+  factory Space.union(List<Space> arms) {
+    // Simplify the arms if possible.
+    List<Space> allArms = <Space>[];
+
+    void addSpace(Space space) {
+      // Discard duplicate arms. Duplicates can appear when working through a
+      // series of cases that destructure multiple fields with different types.
+      // Discarding the duplicates isn't necessary for correctness (a union with
+      // redundant arms contains the same set of values), but improves
+      // performance greatly. In the "sealed subtypes large T with all cases"
+      // test, you end up with a union containing 2520 arms, 2488 are
+      // duplicates. With this check, the largest union has only 5 arms.
+      //
+      // This is O(n^2) since we define only equality on spaces, but a real
+      // implementation would likely define hash code too and then simply
+      // create a hash set to merge duplicates in O(n) time.
+      for (Space existing in allArms) {
+        if (equal(existing, space, 'dedupe union')) return;
+      }
+
+      allArms.add(space);
+    }
+
+    for (Space space in arms) {
+      // Discard empty arms.
+      if (space == empty) continue;
+
+      // Flatten unions. We don't need to flatten recursively since we always
+      // go through this constructor to create unions. A UnionSpace will never
+      // contain UnionSpaces.
+      if (space is UnionSpace) {
+        for (Space arm in space.arms) {
+          addSpace(arm);
+        }
+      } else {
+        addSpace(space);
+      }
+    }
+
+    if (allArms.isEmpty) return empty;
+    if (allArms.length == 1) return allArms.first;
+    return new UnionSpace._(allArms);
+  }
+
+  Space._();
+
+  /// An untyped record space with no fields matches all values and thus isn't
+  /// very useful.
+  bool get isTop => false;
+}
+
+/// A union of spaces. The space A|B contains all of the values of A and B.
+class UnionSpace extends Space {
+  final List<Space> arms;
+
+  UnionSpace._(this.arms) : super._() {
+    assert(arms.length > 1);
+  }
+
+  @override
+  String toString() => arms.join('|');
+}
+
+/// The uninhabited space.
+class _EmptySpace extends Space {
+  _EmptySpace._() : super._();
+
+  @override
+  String toString() => '∅';
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/static_type.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/static_type.dart
new file mode 100644
index 0000000..647e36d
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/static_type.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2022, 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.
+
+// TODO(paulberry,rnystrom): Generics.
+
+/// A static type in the type system.
+class StaticType {
+  /// Built-in top type that all types are a subtype of.
+  static final StaticType top = new StaticType('top', inherits: []);
+
+  static final StaticType nullType = new StaticType('Null');
+
+  final String name;
+
+  late final StaticType nullable = new StaticType._nullable(this);
+
+  /// If this type is a nullable type, then this is the underlying type.
+  ///
+  /// Otherwise `null`.
+  final StaticType? _underlying;
+
+  /// Whether this type is sealed. A sealed type is implicitly abstract and has
+  /// a closed set of known subtypes. This means that every instance of the
+  /// type must be an instance of one of those subtypes. Conversely, if an
+  /// instance is *not* an instance of one of those subtypes, that it must not
+  /// be an instance of this type.
+  ///
+  /// Note that subtypes of a sealed type do not themselves have to be sealed.
+  /// Consider:
+  ///
+  ///      (A)
+  ///      / \
+  ///     B   C
+  ///
+  /// Here, A is sealed and B and C are not. There may be many unknown
+  /// subclasses of B and C, or classes implementing their interfaces. That
+  /// doesn't interfere with exhaustiveness checking because it's still the
+  /// case that any instance of A must be either a B or C *or some subtype of
+  /// one of those two types*.
+  final bool isSealed;
+
+  final Map<String, StaticType> _fields;
+
+  final List<StaticType> _supertypes = [];
+
+  final List<StaticType> _subtypes = [];
+
+  StaticType(this.name,
+      {this.isSealed = false,
+      List<StaticType>? inherits,
+      Map<String, StaticType> fields = const {}})
+      : _underlying = null,
+        _fields = fields {
+    if (inherits != null) {
+      for (StaticType type in inherits) {
+        _supertypes.add(type);
+        type._subtypes.add(this);
+      }
+    } else {
+      _supertypes.add(top);
+    }
+
+    int sealed = 0;
+    for (StaticType supertype in _supertypes) {
+      if (supertype.isSealed) sealed++;
+    }
+
+    // We don't allow a sealed type's subtypes to be shared with some other
+    // sibling supertype, as in D here:
+    //
+    //   (A) (B)
+    //   / \ / \
+    //  C   D   E
+    //
+    // We could remove this restriction but doing so will require
+    // expandTypes() to be more complex. In the example here, if we subtract
+    // E from A, the result should be C|D. That requires knowing that B should
+    // be expanded, which expandTypes() doesn't currently handle.
+    if (sealed > 1) {
+      throw new ArgumentError('Can only have one sealed supertype.');
+    }
+  }
+
+  StaticType._nullable(StaticType underlying)
+      : name = '${underlying.name}?',
+        _underlying = underlying,
+        isSealed = true,
+        // No fields because it may match null which doesn't have them.
+        _fields = {} {}
+
+  /// The static types of the fields this type exposes for record destructuring.
+  ///
+  /// Includes inherited fields.
+  Map<String, StaticType> get fields {
+    return {
+      for (StaticType supertype in _supertypes) ...supertype.fields,
+      ..._fields
+    };
+  }
+
+  bool get isNullable => _underlying != null;
+
+  /// The immediate subtypes of this type.
+  Iterable<StaticType> get subtypes => _subtypes;
+
+  /// The underlying type of this nullable type. It's an error to call this on
+  /// a non-nullable type.
+  StaticType get underlying => _underlying!;
+
+  bool isSubtypeOf(StaticType other) {
+    if (this == other) return true;
+
+    // Null is a subtype of all nullable types.
+    if (this == nullType && other._underlying != null) return true;
+
+    // A nullable type is a subtype if the underlying type and Null both are.
+    StaticType? underlying = _underlying;
+    if (underlying != null) {
+      return underlying.isSubtypeOf(other) && nullType.isSubtypeOf(other);
+    }
+
+    // A non-nullable type is a subtype of the underlying type of a nullable
+    // type.
+    StaticType? otherUnderlying = other._underlying;
+    if (otherUnderlying != null) {
+      return isSubtypeOf(otherUnderlying);
+    }
+
+    for (StaticType supertype in _supertypes) {
+      if (supertype.isSubtypeOf(other)) return true;
+    }
+
+    return false;
+  }
+
+  @override
+  String toString() => name;
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/subtract.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/subtract.dart
new file mode 100644
index 0000000..2da2157
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/subtract.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2022, 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 'intersect_empty.dart';
+import 'profile.dart' as profile;
+import 'space.dart';
+import 'static_type.dart';
+
+/// Recursively replaces [left] with a union of its sealed subtypes as long as
+/// doing so enables it to more precisely match against [right].
+List<StaticType> expandType(StaticType left, StaticType right) {
+  // If [left] is nullable and right is null or non-nullable, then expand the
+  // nullable type.
+  if (left.isNullable && (right == StaticType.nullType || !right.isNullable)) {
+    return [...expandType(left.underlying, right), StaticType.nullType];
+  }
+
+  // If [right] is nullable, then expand using its underlying type.
+  if (right.isNullable) {
+    return expandType(left, right.underlying);
+  }
+
+  // If [left] is a sealed supertype and [right] is in its subtype hierarchy,
+  // then expand out the subtypes (recursively) to more precisely match [right].
+  if (left.isSealed && left != right && right.isSubtypeOf(left)) {
+    return {
+      for (StaticType subtype in left.subtypes) ...expandType(subtype, right),
+    }.toList();
+  }
+
+  return [left];
+}
+
+/// Returns a new [Space] that contains all of the values of [left] that are
+/// not also in [right].
+Space subtract(Space left, Space right) {
+  profile.count('subtract');
+
+  // Subtracting from empty is still empty.
+  if (left == Space.empty) return Space.empty;
+
+  // Subtracting nothing leaves it unchanged.
+  if (right == Space.empty) return left;
+
+  // Distribute a union on the left.
+  // A|B - x => A-x | B-x
+  if (left is UnionSpace) {
+    return new Space.union(
+        left.arms.map((arm) => subtract(arm, right)).toList());
+  }
+
+  // Distribute a union on the right.
+  // x - A|B => x - A - B
+  if (right is UnionSpace) {
+    Space result = left;
+    for (Space arm in right.arms) {
+      result = subtract(result, arm);
+    }
+    return result;
+  }
+
+  // Otherwise, it must be two extract spaces.
+  return _subtractExtract(left as ExtractSpace, right as ExtractSpace);
+}
+
+/// Returns `true` if every field in [leftFields] is covered by the
+/// corresponding field in [rightFields].
+bool _isLeftSubspace(StaticType leftType, List<String> fieldNames,
+    Map<String, Space> leftFields, Map<String, Space> rightFields) {
+  for (String name in fieldNames) {
+    if (subtract(leftFields[name]!, rightFields[name]!) != Space.empty) {
+      return false;
+    }
+  }
+
+  // If we get here, every field covered.
+  return true;
+}
+
+/// Subtract [right] from [left].
+Space _subtractExtract(ExtractSpace left, ExtractSpace right) {
+  List<String> fieldNames =
+      {...left.fields.keys, ...right.fields.keys}.toList();
+
+  List<Space> spaces = <Space>[];
+
+  // If the left type is in a sealed hierarchy, expanding it to its subtypes
+  // might let us calculate the subtraction more precisely.
+  List<StaticType> subtypes = expandType(left.type, right.type);
+  for (StaticType subtype in subtypes) {
+    spaces.addAll(_subtractExtractAtType(subtype, left, right, fieldNames));
+  }
+
+  return new Space.union(spaces);
+}
+
+/// Subtract [right] from [left], but using [type] for left's type, which may
+/// be a more specific subtype of [left]'s own type is a sealed supertype.
+List<Space> _subtractExtractAtType(StaticType type, ExtractSpace left,
+    ExtractSpace right, List<String> fieldNames) {
+  // If the right type doesn't cover the left (even after expanding sealed
+  // types), then we can't do anything with the fields since they may not
+  // even come into play for all values. Subtract nothing from this subtype
+  // and keep all of the current fields.
+  if (!type.isSubtypeOf(right.type)) return [new Space(type, left.fields)];
+
+  // Infer any fields that appear in one space and not the other.
+  Map<String, Space> leftFields = <String, Space>{};
+  Map<String, Space> rightFields = <String, Space>{};
+  for (String name in fieldNames) {
+    // If the right space matches on a field that the left doesn't have, infer
+    // it from the static type of the field. That contains the same set of
+    // values as having no field at all.
+    leftFields[name] = left.fields[name] ?? new Space(type.fields[name]!);
+
+    // If the left matches on a field that the right doesn't have, infer top
+    // for the right field since the right will accept any of left's values for
+    // that field.
+    rightFields[name] = right.fields[name] ?? Space.top;
+  }
+
+  // If any pair of fields have no overlapping values, then no overall value
+  // that matches the left space will also match the right space. So the right
+  // space doesn't subtract anything and we keep the left space as-is.
+  for (String name in fieldNames) {
+    if (intersectEmpty(leftFields[name]!, rightFields[name]!)) {
+      return [new Space(type, left.fields)];
+    }
+  }
+
+  // If all the right's fields strictly cover all of the left's, then the
+  // right completely subtracts this type and nothing remains.
+  if (_isLeftSubspace(type, fieldNames, leftFields, rightFields)) {
+    return const [];
+  }
+
+  // The right side is a supertype but its fields don't totally cover, so
+  // handle each of them individually.
+
+  // Walk the fields and see which ones are modified by the right-hand fields.
+  Map<String, Space> fixed = <String, Space>{};
+  Map<String, Space> changedDifference = <String, Space>{};
+  for (String name in fieldNames) {
+    Space difference = subtract(leftFields[name]!, rightFields[name]!);
+    if (difference == Space.empty) {
+      // The right field accepts all the values that the left field accepts, so
+      // keep the left field as it is.
+      fixed[name] = leftFields[name]!;
+    } else if (difference.isTop) {
+      // If the resulting field matches everything, simply discard it since
+      // it's equivalent to omitting the field.
+    } else {
+      changedDifference[name] = difference;
+    }
+  }
+
+  // If no fields are affected by the subtraction, just return a single arm
+  // with all of the fields.
+  if (changedDifference.isEmpty) return [new Space(type, fixed)];
+
+  // For each field whose `left - right` is different, include an arm that
+  // includes that one difference.
+  List<String> changedFields = changedDifference.keys.toList();
+  List<Space> spaces = <Space>[];
+  for (int i = 0; i < changedFields.length; i++) {
+    Map<String, Space> fields = {...fixed};
+
+    for (int j = 0; j < changedFields.length; j++) {
+      String name = changedFields[j];
+      if (i == j) {
+        fields[name] = changedDifference[name]!;
+      } else {
+        fields[name] = leftFields[name]!;
+      }
+    }
+
+    spaces.add(new Space(type, fields));
+  }
+
+  return spaces;
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/expand_type_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/expand_type_test.dart
new file mode 100644
index 0000000..0b0adb7
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/expand_type_test.dart
@@ -0,0 +1,232 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/subtract.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test('sealed', () {
+    //   (A)
+    //   /|\
+    //  B C(D)
+    //     / \
+    //    E   F
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', isSealed: true, inherits: [a]);
+    var e = StaticType('E', inherits: [d]);
+    var f = StaticType('F', inherits: [d]);
+
+    expectExpand(a, a, 'A');
+    expectExpand(a, b, 'B|C|D');
+    expectExpand(a, c, 'B|C|D');
+    expectExpand(a, d, 'B|C|D');
+    expectExpand(a, e, 'B|C|E|F');
+    expectExpand(a, f, 'B|C|E|F');
+
+    expectExpand(d, a, 'D');
+    expectExpand(d, b, 'D');
+    expectExpand(d, c, 'D');
+    expectExpand(d, d, 'D');
+    expectExpand(d, e, 'E|F');
+    expectExpand(d, f, 'E|F');
+  });
+
+  test('unsealed', () {
+    //    A
+    //   /|\
+    //  B C D
+    //     / \
+    //    E   F
+    var a = StaticType('A');
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [a]);
+    var e = StaticType('E', inherits: [d]);
+    var f = StaticType('F', inherits: [d]);
+
+    expectExpand(a, a, 'A');
+    expectExpand(a, b, 'A');
+    expectExpand(a, c, 'A');
+    expectExpand(a, d, 'A');
+    expectExpand(a, e, 'A');
+    expectExpand(a, f, 'A');
+
+    expectExpand(d, a, 'D');
+    expectExpand(d, b, 'D');
+    expectExpand(d, c, 'D');
+    expectExpand(d, d, 'D');
+    expectExpand(d, e, 'D');
+    expectExpand(d, f, 'D');
+  });
+
+  test('unsealed in middle', () {
+    //    (A)
+    //    / \
+    //   B   C
+    //      / \
+    //     D  (E)
+    //        / \
+    //       F   G
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [c]);
+    var e = StaticType('E', isSealed: true, inherits: [c]);
+    var f = StaticType('F', inherits: [e]);
+    var g = StaticType('G', inherits: [e]);
+
+    expectExpand(a, a, 'A');
+    expectExpand(a, b, 'B|C');
+    expectExpand(a, c, 'B|C');
+    expectExpand(a, d, 'B|C');
+    expectExpand(a, e, 'B|C');
+    expectExpand(a, f, 'B|C');
+
+    expectExpand(c, a, 'C');
+    expectExpand(c, b, 'C');
+    expectExpand(c, c, 'C');
+    expectExpand(c, d, 'C');
+    expectExpand(c, e, 'C');
+    expectExpand(c, f, 'C');
+
+    expectExpand(e, a, 'E');
+    expectExpand(e, b, 'E');
+    expectExpand(e, c, 'E');
+    expectExpand(e, e, 'E');
+    expectExpand(e, f, 'F|G');
+    expectExpand(e, g, 'F|G');
+  });
+
+  test('transitive sealed family', () {
+    //     (A)
+    //     / \
+    //   (B) (C)
+    //   / | | \
+    //  D  E F  G
+    //     \ /
+    //      H
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', isSealed: true, inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b]);
+    var f = StaticType('F', inherits: [c]);
+    var g = StaticType('G', inherits: [c]);
+    var h = StaticType('H', inherits: [e, f]);
+
+    expectExpand(a, a, 'A');
+    expectExpand(a, b, 'B|C');
+    expectExpand(a, c, 'B|C');
+    expectExpand(a, d, 'D|E|C');
+    expectExpand(a, e, 'D|E|C');
+    expectExpand(a, f, 'B|F|G');
+    expectExpand(a, g, 'B|F|G');
+    expectExpand(a, h, 'D|E|F|G');
+
+    expectExpand(b, a, 'B');
+    expectExpand(b, b, 'B');
+    expectExpand(b, c, 'B');
+    expectExpand(b, d, 'D|E');
+    expectExpand(b, e, 'D|E');
+    expectExpand(b, f, 'B');
+    expectExpand(b, h, 'D|E');
+
+    expectExpand(d, a, 'D');
+    expectExpand(d, b, 'D');
+    expectExpand(d, c, 'D');
+    expectExpand(d, d, 'D');
+    expectExpand(d, e, 'D');
+    expectExpand(d, f, 'D');
+
+    expectExpand(e, a, 'E');
+    expectExpand(e, b, 'E');
+    expectExpand(e, c, 'E');
+    expectExpand(e, d, 'E');
+    expectExpand(e, e, 'E');
+    expectExpand(e, f, 'E');
+    expectExpand(e, h, 'E');
+
+    expectExpand(h, a, 'H');
+    expectExpand(h, b, 'H');
+    expectExpand(h, d, 'H');
+    expectExpand(h, e, 'H');
+    expectExpand(h, h, 'H');
+  });
+
+  test('sealed with multiple paths', () {
+    //     (A)
+    //     / \
+    //   (B)  C
+    //   / \ /
+    //  D   E
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b, c]);
+
+    expectExpand(a, a, 'A');
+    expectExpand(a, b, 'B|C');
+    expectExpand(a, c, 'B|C');
+    expectExpand(a, d, 'D|E|C');
+    expectExpand(a, e, 'D|E|C');
+
+    expectExpand(b, a, 'B');
+    expectExpand(b, b, 'B');
+    expectExpand(b, c, 'B');
+    expectExpand(b, d, 'D|E');
+    expectExpand(b, e, 'D|E');
+
+    expectExpand(c, a, 'C');
+    expectExpand(c, b, 'C');
+    expectExpand(c, c, 'C');
+    expectExpand(c, d, 'C');
+    expectExpand(c, e, 'C');
+
+    expectExpand(d, a, 'D');
+    expectExpand(d, b, 'D');
+    expectExpand(d, c, 'D');
+    expectExpand(d, d, 'D');
+    expectExpand(d, e, 'D');
+
+    expectExpand(e, a, 'E');
+    expectExpand(e, b, 'E');
+    expectExpand(e, c, 'E');
+    expectExpand(e, d, 'E');
+    expectExpand(e, e, 'E');
+  });
+
+  test('nullable', () {
+    //   (A)
+    //   / \
+    //  B   C
+    //     / \
+    //    D   E
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [c]);
+
+    expectExpand(a.nullable, a, 'A|Null');
+    expectExpand(a, a.nullable, 'A');
+    expectExpand(a.nullable, a.nullable, 'A|Null');
+
+    // Sealed subtype.
+    expectExpand(a.nullable, b, 'B|C|Null');
+    expectExpand(a, b.nullable, 'B|C');
+    expectExpand(a.nullable, b.nullable, 'B|C|Null');
+
+    // Unsealed subtype.
+    expectExpand(c.nullable, d, 'C|Null');
+    expectExpand(c, d.nullable, 'C');
+    expectExpand(c.nullable, d.nullable, 'C|Null');
+  });
+}
+
+void expectExpand(StaticType left, StaticType right, String expected) {
+  expect(expandType(left, right).join('|'), expected);
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_empty_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_empty_test.dart
new file mode 100644
index 0000000..d25df88
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_empty_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/intersect_empty.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  //   (A)
+  //   / \
+  //  B   C
+  var a = StaticType('A', isSealed: true);
+  var b = StaticType('B', inherits: [a]);
+  var c = StaticType('C', inherits: [a]);
+
+  Space A({StaticType? x, StaticType? y, StaticType? z}) => ty(
+      a, {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+  Space B({StaticType? x, StaticType? y, StaticType? z}) => ty(
+      b, {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+  Space C({StaticType? x, StaticType? y, StaticType? z}) => ty(
+      c, {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+
+  test('records', () {
+    expectIntersectEmpty(rec(x: a, y: a), rec(x: a, y: a), isFalse);
+    expectIntersectEmpty(rec(x: a, y: a), rec(x: a), isFalse);
+    expectIntersectEmpty(rec(w: a, x: a), rec(y: a, z: a), isFalse);
+    expectIntersectEmpty(rec(w: a, x: a, y: a), rec(x: a, y: a, z: a), isFalse);
+  });
+
+  test('types', () {
+    // Note: More comprehensive tests under intersect_types_test.dart.
+    expectIntersectEmpty(a, a, isFalse);
+    expectIntersectEmpty(a, b, isFalse);
+    expectIntersectEmpty(a, c, isFalse);
+    expectIntersectEmpty(b, c, isTrue);
+  });
+
+  test('field types', () {
+    expectIntersectEmpty(rec(x: a, y: b), rec(x: b, y: a), isFalse);
+    expectIntersectEmpty(rec(x: b), rec(x: c), isTrue);
+  });
+
+  test('types and fields', () {
+    expectIntersectEmpty(A(x: a), A(x: a), isFalse);
+    expectIntersectEmpty(A(x: a), A(x: b), isFalse);
+    expectIntersectEmpty(A(x: b), A(x: c), isTrue);
+
+    expectIntersectEmpty(A(x: a), B(x: a), isFalse);
+    expectIntersectEmpty(A(x: a), B(x: b), isFalse);
+    expectIntersectEmpty(A(x: b), B(x: c), isTrue);
+
+    expectIntersectEmpty(B(x: a), A(x: a), isFalse);
+    expectIntersectEmpty(B(x: a), A(x: b), isFalse);
+    expectIntersectEmpty(B(x: b), A(x: c), isTrue);
+
+    expectIntersectEmpty(B(x: a), B(x: a), isFalse);
+    expectIntersectEmpty(B(x: a), B(x: b), isFalse);
+    expectIntersectEmpty(B(x: b), B(x: c), isTrue);
+
+    expectIntersectEmpty(B(x: a), C(x: a), isTrue);
+    expectIntersectEmpty(B(x: a), C(x: b), isTrue);
+    expectIntersectEmpty(B(x: b), C(x: c), isTrue);
+  });
+}
+
+void expectIntersectEmpty(Object left, Object right, Matcher expected) {
+  var leftSpace = parseSpace(left);
+  var rightSpace = parseSpace(right);
+
+  // Intersection is symmetric so try both directions.
+  expect(intersectEmpty(leftSpace, rightSpace), expected);
+  expect(intersectEmpty(rightSpace, leftSpace), expected);
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_test.dart
new file mode 100644
index 0000000..f90fa5a
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/intersect.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  //   (A)
+  //   / \
+  //  B   C
+  var a = StaticType('A', isSealed: true);
+  var b = StaticType('B', inherits: [a]);
+  var c = StaticType('C', inherits: [a]);
+
+  Space A({StaticType? x, StaticType? y, StaticType? z}) => ty(
+      a, {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+  Space B({StaticType? x, StaticType? y, StaticType? z}) => ty(
+      b, {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+  Space C({StaticType? x, StaticType? y, StaticType? z}) => ty(
+      c, {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+
+  test('records', () {
+    expectIntersect(rec(x: a, y: a), rec(x: a, y: a), rec(x: a, y: a));
+    expectIntersect(rec(x: a, y: a), rec(x: a), rec(x: a, y: a));
+    expectIntersect(
+        rec(w: a, x: a), rec(y: a, z: a), rec(w: a, x: a, y: a, z: a));
+    expectIntersect(rec(w: a, x: a, y: a), rec(x: a, y: a, z: a),
+        rec(w: a, x: a, y: a, z: a));
+  });
+
+  test('types', () {
+    // Note: More comprehensive tests under intersect_types_test.dart.
+    expectIntersect(a, a, a);
+    expectIntersect(a, b, b);
+    expectIntersect(a, c, c);
+    expectIntersect(b, c, '∅');
+  });
+
+  test('field types', () {
+    expectIntersect(rec(x: a, y: b), rec(x: b, y: a), rec(x: b, y: b));
+    expectIntersect(rec(x: b), rec(x: c), '∅');
+  });
+
+  test('types and fields', () {
+    expectIntersect(A(x: a), A(x: a), A(x: a));
+    expectIntersect(A(x: a), A(x: b), A(x: b));
+    expectIntersect(A(x: b), A(x: c), '∅');
+
+    expectIntersect(A(x: a), B(x: a), B(x: a));
+    expectIntersect(A(x: a), B(x: b), B(x: b));
+    expectIntersect(A(x: b), B(x: c), '∅');
+
+    expectIntersect(B(x: a), A(x: a), B(x: a));
+    expectIntersect(B(x: a), A(x: b), B(x: b));
+    expectIntersect(B(x: b), A(x: c), '∅');
+
+    expectIntersect(B(x: a), B(x: a), B(x: a));
+    expectIntersect(B(x: a), B(x: b), B(x: b));
+    expectIntersect(B(x: b), B(x: c), '∅');
+
+    expectIntersect(B(x: a), C(x: a), '∅');
+    expectIntersect(B(x: a), C(x: b), '∅');
+    expectIntersect(B(x: b), C(x: c), '∅');
+  });
+}
+
+void expectIntersect(Object left, Object right, Object expected) {
+  var leftSpace = parseSpace(left);
+  var rightSpace = parseSpace(right);
+  var expectedText = parseSpace(expected).toString();
+
+  // Intersection is symmetric so try both directions.
+  expect(intersect(leftSpace, rightSpace).toString(), expectedText);
+  expect(intersect(rightSpace, leftSpace).toString(), expectedText);
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_types_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_types_test.dart
new file mode 100644
index 0000000..704e9fd
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/intersect_types_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/intersect.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+void main() {
+  test('hierarchy', () {
+    //   (A)
+    //   /|\
+    //  B C(D)
+    //     / \
+    //    E   F
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', isSealed: true, inherits: [a]);
+    var e = StaticType('E', inherits: [d]);
+    var f = StaticType('F', inherits: [d]);
+
+    expectIntersect(a, a, a);
+    expectIntersect(a, b, b);
+    expectIntersect(a, c, c);
+    expectIntersect(a, d, d);
+    expectIntersect(a, e, e);
+    expectIntersect(a, f, f);
+
+    expectIntersect(b, b, b);
+    expectIntersect(b, c, null);
+    expectIntersect(b, d, null);
+    expectIntersect(b, e, null);
+    expectIntersect(b, f, null);
+
+    expectIntersect(c, c, c);
+    expectIntersect(c, d, null);
+    expectIntersect(c, e, null);
+    expectIntersect(c, f, null);
+
+    expectIntersect(d, d, d);
+    expectIntersect(d, e, e);
+    expectIntersect(d, f, f);
+
+    expectIntersect(e, e, e);
+    expectIntersect(e, f, null);
+  });
+
+  test('sealed with multiple paths', () {
+    //     (A)
+    //     / \
+    //   (B)  C
+    //   / \ /
+    //  D   E
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b, c]);
+
+    expectIntersect(a, a, a);
+    expectIntersect(a, b, b);
+    expectIntersect(a, c, c);
+    expectIntersect(a, d, d);
+    expectIntersect(a, e, e);
+    expectIntersect(b, b, b);
+    expectIntersect(b, c, null);
+    expectIntersect(b, d, d);
+    expectIntersect(b, e, e);
+    expectIntersect(c, c, c);
+    expectIntersect(c, d, null);
+    expectIntersect(c, e, e);
+    expectIntersect(d, d, d);
+    expectIntersect(d, e, null);
+    expectIntersect(e, e, e);
+  });
+
+  test('nullable', () {
+    // A
+    // |
+    // B
+    var a = StaticType('A');
+    var b = StaticType('B', inherits: [a]);
+
+    expectIntersect(a, a.nullable, a);
+    expectIntersect(a, StaticType.nullType, null);
+    expectIntersect(a.nullable, StaticType.nullType, StaticType.nullType);
+
+    expectIntersect(a, b.nullable, b);
+    expectIntersect(a.nullable, b, b);
+    expectIntersect(a.nullable, b.nullable, b.nullable);
+  });
+}
+
+void expectIntersect(StaticType left, StaticType right, StaticType? expected) {
+  // Intersection is symmetric so try both directions.
+  expect(intersectTypes(left, right), expected);
+  expect(intersectTypes(right, left), expected);
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_field_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_field_test.dart
new file mode 100644
index 0000000..e127979
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_field_test.dart
@@ -0,0 +1,259 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('sealed subtypes', () {
+    //   (A)
+    //   / \
+    //  B   C
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var t = StaticType('T', fields: {'x': a, 'y': a});
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': b, 'y': b},
+      {'x': b, 'y': c},
+      {'x': c, 'y': b},
+      {'x': c, 'y': c},
+    ]);
+  });
+
+  group('sealed subtypes medium', () {
+    //   (A)
+    //   /|\
+    //  B C D
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [a]);
+    var t = StaticType('T', fields: {'y': a, 'z': a});
+
+    expectExhaustiveOnlyAll(t, [
+      {'y': b, 'z': b},
+      {'y': b, 'z': c},
+      {'y': b, 'z': d},
+      {'y': c, 'z': b},
+      {'y': c, 'z': c},
+      {'y': c, 'z': d},
+      {'y': d, 'z': b},
+      {'y': d, 'z': c},
+      {'y': d, 'z': d},
+    ]);
+  });
+
+  group('sealed subtypes large', () {
+    //   (A)
+    //   /|\
+    //  B C D
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [a]);
+    var t = StaticType('T', fields: {'w': a, 'x': a, 'y': a, 'z': a});
+
+    expectExhaustiveOnlyAll(t, [
+      {'w': b, 'x': b, 'y': b, 'z': b},
+      {'w': b, 'x': b, 'y': b, 'z': c},
+      {'w': b, 'x': b, 'y': b, 'z': d},
+      {'w': b, 'x': b, 'y': c, 'z': b},
+      {'w': b, 'x': b, 'y': c, 'z': c},
+      {'w': b, 'x': b, 'y': c, 'z': d},
+      {'w': b, 'x': b, 'y': d, 'z': b},
+      {'w': b, 'x': b, 'y': d, 'z': c},
+      {'w': b, 'x': b, 'y': d, 'z': d},
+      {'w': b, 'x': c, 'y': b, 'z': b},
+      {'w': b, 'x': c, 'y': b, 'z': c},
+      {'w': b, 'x': c, 'y': b, 'z': d},
+      {'w': b, 'x': c, 'y': c, 'z': b},
+      {'w': b, 'x': c, 'y': c, 'z': c},
+      {'w': b, 'x': c, 'y': c, 'z': d},
+      {'w': b, 'x': c, 'y': d, 'z': b},
+      {'w': b, 'x': c, 'y': d, 'z': c},
+      {'w': b, 'x': c, 'y': d, 'z': d},
+      {'w': b, 'x': d, 'y': b, 'z': b},
+      {'w': b, 'x': d, 'y': b, 'z': c},
+      {'w': b, 'x': d, 'y': b, 'z': d},
+      {'w': b, 'x': d, 'y': c, 'z': b},
+      {'w': b, 'x': d, 'y': c, 'z': c},
+      {'w': b, 'x': d, 'y': c, 'z': d},
+      {'w': b, 'x': d, 'y': d, 'z': b},
+      {'w': b, 'x': d, 'y': d, 'z': c},
+      {'w': b, 'x': d, 'y': d, 'z': d},
+      {'w': c, 'x': b, 'y': b, 'z': b},
+      {'w': c, 'x': b, 'y': b, 'z': c},
+      {'w': c, 'x': b, 'y': b, 'z': d},
+      {'w': c, 'x': b, 'y': c, 'z': b},
+      {'w': c, 'x': b, 'y': c, 'z': c},
+      {'w': c, 'x': b, 'y': c, 'z': d},
+      {'w': c, 'x': b, 'y': d, 'z': b},
+      {'w': c, 'x': b, 'y': d, 'z': c},
+      {'w': c, 'x': b, 'y': d, 'z': d},
+      {'w': c, 'x': c, 'y': b, 'z': b},
+      {'w': c, 'x': c, 'y': b, 'z': c},
+      {'w': c, 'x': c, 'y': b, 'z': d},
+      {'w': c, 'x': c, 'y': c, 'z': b},
+      {'w': c, 'x': c, 'y': c, 'z': c},
+      {'w': c, 'x': c, 'y': c, 'z': d},
+      {'w': c, 'x': c, 'y': d, 'z': b},
+      {'w': c, 'x': c, 'y': d, 'z': c},
+      {'w': c, 'x': c, 'y': d, 'z': d},
+      {'w': c, 'x': d, 'y': b, 'z': b},
+      {'w': c, 'x': d, 'y': b, 'z': c},
+      {'w': c, 'x': d, 'y': b, 'z': d},
+      {'w': c, 'x': d, 'y': c, 'z': b},
+      {'w': c, 'x': d, 'y': c, 'z': c},
+      {'w': c, 'x': d, 'y': c, 'z': d},
+      {'w': c, 'x': d, 'y': d, 'z': b},
+      {'w': c, 'x': d, 'y': d, 'z': c},
+      {'w': c, 'x': d, 'y': d, 'z': d},
+      {'w': d, 'x': b, 'y': b, 'z': b},
+      {'w': d, 'x': b, 'y': b, 'z': c},
+      {'w': d, 'x': b, 'y': b, 'z': d},
+      {'w': d, 'x': b, 'y': c, 'z': b},
+      {'w': d, 'x': b, 'y': c, 'z': c},
+      {'w': d, 'x': b, 'y': c, 'z': d},
+      {'w': d, 'x': b, 'y': d, 'z': b},
+      {'w': d, 'x': b, 'y': d, 'z': c},
+      {'w': d, 'x': b, 'y': d, 'z': d},
+      {'w': d, 'x': c, 'y': b, 'z': b},
+      {'w': d, 'x': c, 'y': b, 'z': c},
+      {'w': d, 'x': c, 'y': b, 'z': d},
+      {'w': d, 'x': c, 'y': c, 'z': b},
+      {'w': d, 'x': c, 'y': c, 'z': c},
+      {'w': d, 'x': c, 'y': c, 'z': d},
+      {'w': d, 'x': c, 'y': d, 'z': b},
+      {'w': d, 'x': c, 'y': d, 'z': c},
+      {'w': d, 'x': c, 'y': d, 'z': d},
+      {'w': d, 'x': d, 'y': b, 'z': b},
+      {'w': d, 'x': d, 'y': b, 'z': c},
+      {'w': d, 'x': d, 'y': b, 'z': d},
+      {'w': d, 'x': d, 'y': c, 'z': b},
+      {'w': d, 'x': d, 'y': c, 'z': c},
+      {'w': d, 'x': d, 'y': c, 'z': d},
+      {'w': d, 'x': d, 'y': d, 'z': b},
+      {'w': d, 'x': d, 'y': d, 'z': c},
+      {'w': d, 'x': d, 'y': d, 'z': d},
+    ]);
+  });
+
+  group('sealed transitive subtypes', () {
+    //     (A)
+    //     / \
+    //   (B) (C)
+    //   / \   \
+    //  D   E   F
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', isSealed: true, inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b]);
+    var f = StaticType('F', inherits: [c]);
+
+    var t = StaticType('T', fields: {'x': a, 'y': a});
+    expectExhaustiveOnlyAll(t, [
+      {'x': a, 'y': a},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': b, 'y': b},
+      {'x': b, 'y': c},
+      {'x': c, 'y': b},
+      {'x': c, 'y': c},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': b, 'y': d},
+      {'x': b, 'y': e},
+      {'x': b, 'y': f},
+      {'x': c, 'y': d},
+      {'x': c, 'y': e},
+      {'x': c, 'y': f},
+    ]);
+  });
+
+  group('unsealed subtypes', () {
+    //    A
+    //   / \
+    //  B   C
+    var a = StaticType('A');
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+
+    // Not exhaustive even when known subtypes covered.
+    var t = StaticType('T', fields: {'x': a, 'y': a});
+    expectNeverExhaustive(t, [
+      {'x': b, 'y': b},
+      {'x': b, 'y': c},
+      {'x': c, 'y': b},
+      {'x': c, 'y': c},
+    ]);
+
+    // Exhaustive if field static type is a covered subtype.
+    var u = StaticType('T', fields: {'x': b, 'y': c});
+    expectExhaustiveOnlyAll(u, [
+      {'x': b, 'y': c},
+    ]);
+  });
+
+  group('different fields', () {
+    //   (A)
+    //   / \
+    //  B   C
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var t = StaticType('T', fields: {'x': a, 'y': a, 'z': a});
+
+    expectNeverExhaustive(t, [
+      {'x': b},
+      {'y': b},
+      {'z': b},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': b, 'y': a},
+      {'x': c, 'z': a},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': b, 'y': b},
+      {'x': b, 'y': c},
+      {'x': c, 'y': b},
+      {'x': c, 'y': c},
+    ]);
+  });
+
+  group('field types', () {
+    //   (A)
+    //   / \
+    //  B   C
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var t = StaticType('T', fields: {'x': a, 'y': b, 'z': c});
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': a, 'y': b, 'z': c},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'x': b},
+      {'x': c},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'y': b},
+    ]);
+
+    expectExhaustiveOnlyAll(t, [
+      {'z': c},
+    ]);
+  });
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_nested_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_nested_test.dart
new file mode 100644
index 0000000..d236651
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_nested_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('nested records', () {
+    //   (A)
+    //   / \
+    //  B   C
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var t = StaticType('T', fields: {'x': a, 'y': b});
+    var u = StaticType('U', fields: {'w': t, 'z': t});
+
+    expectExhaustiveOnlyAll(u, [
+      rec(w: rec(x: a), z: t),
+    ]);
+
+    expectExhaustiveOnlyAll(u, [
+      rec(w: rec(x: a, y: a), z: rec(x: a, y: a)),
+    ]);
+
+    expectExhaustiveOnlyAll(u, [
+      rec(w: rec(x: a, y: b), z: rec(x: a, y: b)),
+    ]);
+
+    expectExhaustiveOnlyAll(u, [
+      rec(w: rec(x: b), z: t),
+      rec(w: rec(x: c), z: t),
+    ]);
+
+    expectExhaustiveOnlyAll(u, [
+      rec(w: rec(x: b, y: b), z: rec(x: b, y: b)),
+      rec(w: rec(x: b, y: b), z: rec(x: c, y: b)),
+      rec(w: rec(x: c, y: b), z: rec(x: b, y: b)),
+      rec(w: rec(x: c, y: b), z: rec(x: c, y: b)),
+    ]);
+  });
+
+  group('nested with different fields of same name', () {
+    // A B C D
+    var a = StaticType('A');
+    var b = StaticType('B', fields: {'x': a});
+    var c = StaticType('C', fields: {'x': b});
+    var d = StaticType('D', fields: {'x': c});
+
+    expectExhaustiveOnlyAll(d, [
+      rec(x: rec(x: rec(x: a))),
+    ]);
+  });
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_type_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_type_test.dart
new file mode 100644
index 0000000..77c37ed
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/is_exhaustive_type_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+/// Test `subtract()` on combinations of types.
+void main() {
+  // Note: In the class diagrams, "(_)" means "sealed". A bare name is unsealed.
+  group('sealed family', () {
+    //     (A)
+    //     / \
+    //   (B) (C)
+    //   / \   \
+    //  D   E   F
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', isSealed: true, inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b]);
+    var f = StaticType('F', inherits: [c]);
+
+    var checkExhaustive = _makeTestFunction([a, b, c, d, e, f]);
+    checkExhaustive([a], 'ABCDEF');
+    checkExhaustive([b], 'BDE');
+    checkExhaustive([c], 'CF');
+    checkExhaustive([d], 'D');
+    checkExhaustive([f], 'CF');
+
+    checkExhaustive([a, b], 'ABCDEF');
+    checkExhaustive([a, c], 'ABCDEF');
+    checkExhaustive([a, d], 'ABCDEF');
+    checkExhaustive([a, f], 'ABCDEF');
+
+    checkExhaustive([b, c], 'ABCDEF');
+    checkExhaustive([b, d], 'BDE');
+    checkExhaustive([b, f], 'ABCDEF');
+
+    checkExhaustive([c, d], 'CDF');
+    checkExhaustive([c, e], 'CEF');
+    checkExhaustive([c, f], 'CF');
+
+    checkExhaustive([d, e], 'BDE'); // Covers B because both cases covered.
+    checkExhaustive([d, f], 'CDF');
+    checkExhaustive([e, f], 'CEF');
+
+    checkExhaustive([d, e, f], 'ABCDEF'); // All cases covered.
+  });
+
+  group('sealed with many subtypes', () {
+    //     (A)
+    //    //|\\
+    //   / /|\ \
+    //  B C D E F
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [a]);
+    var e = StaticType('E', inherits: [a]);
+    var f = StaticType('F', inherits: [a]);
+
+    var checkExhaustive = _makeTestFunction([a, b, c, d, e, f]);
+    checkExhaustive([a], 'ABCDEF');
+    checkExhaustive([b], 'B');
+    checkExhaustive([c, e], 'CE');
+    checkExhaustive([b, d, f], 'BDF');
+    checkExhaustive([b, c, e, f], 'BCEF');
+    checkExhaustive([b, c, d, e, f], 'ABCDEF'); // Covers A.
+  });
+
+  group('sealed with multiple paths', () {
+    //     (A)
+    //     / \
+    //   (B)  C
+    //   / \ /
+    //  D   E
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b, c]);
+
+    var checkExhaustive = _makeTestFunction([a, b, c, d, e]);
+    checkExhaustive([a], 'ABCDE');
+    checkExhaustive([b], 'BDE');
+    checkExhaustive([c], 'CE');
+    checkExhaustive([d], 'D');
+    checkExhaustive([e], 'E');
+
+    checkExhaustive([b, c], 'ABCDE');
+    checkExhaustive([b, d], 'BDE');
+    checkExhaustive([b, e], 'BDE');
+    checkExhaustive([c, d], 'CDE');
+    checkExhaustive([d, e], 'BDE');
+  });
+
+  group('sealed with unsealed supertype', () {
+    //    A
+    //    |
+    //   (B)
+    //   / \
+    //  C   D
+    var a = StaticType('A');
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', inherits: [b]);
+    var d = StaticType('D', inherits: [b]);
+
+    var checkExhaustive = _makeTestFunction([a, b, c, d]);
+    checkExhaustive([a], 'ABCD');
+    checkExhaustive([b], 'BCD');
+    checkExhaustive([c], 'C');
+    checkExhaustive([d], 'D');
+    checkExhaustive([c, d], 'BCD');
+  });
+
+  group('sealed with single subclass', () {
+    // (A)
+    //  |
+    // (B)
+    //  |
+    //  C
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', isSealed: true, inherits: [a]);
+    var c = StaticType('C', inherits: [b]);
+
+    var checkExhaustive = _makeTestFunction([a, b, c]);
+    checkExhaustive([a], 'ABC');
+    checkExhaustive([b], 'ABC'); // Every A must be a B, so A is covered.
+    checkExhaustive([c], 'ABC'); // Every C must be a B, which must be an A.
+    checkExhaustive([a, b], 'ABC');
+    checkExhaustive([a, c], 'ABC');
+    checkExhaustive([b, c], 'ABC');
+    checkExhaustive([a, b, c], 'ABC');
+  });
+
+  group('unsealed', () {
+    //      A
+    //     / \
+    //    B   C
+    //   / \ / \
+    //  D   E   F
+    var a = StaticType('A');
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [b]);
+    var e = StaticType('E', inherits: [b, c]);
+    var f = StaticType('F', inherits: [c]);
+
+    var checkExhaustive = _makeTestFunction([a, b, c, d, e, f]);
+    checkExhaustive([a], 'ABCDEF');
+    checkExhaustive([b], 'BDE');
+    checkExhaustive([d], 'D');
+    checkExhaustive([a, b], 'ABCDEF'); // Same as A.
+    checkExhaustive([a, d], 'ABCDEF'); // Same as A.
+    checkExhaustive([d, e], 'DE'); // Doesn't cover B because unsealed.
+    checkExhaustive([d, f], 'DF');
+    checkExhaustive([e, f], 'EF'); // Doesn't cover C because unsealed.
+    checkExhaustive([b, f], 'BDEF');
+    checkExhaustive([c, d], 'CDEF');
+    checkExhaustive([d, e, f], 'DEF');
+  });
+}
+
+/// Returns a function that takes a list of `types` and a string containing a
+/// list of type letters that map to the types in [allTypes].
+///
+/// The function checks that the list of types exhaustively covers every type
+/// whose name appears in the string. So:
+///
+///     checkExhaustive([d, e], 'bde');
+///
+/// Means that the union of D|E should be exhaustive over B, D, and E and not
+/// exhaustive over the other types in [allTypes].
+Function(List<StaticType>, String) _makeTestFunction(
+    List<StaticType> allTypes) {
+  assert(allTypes.length <= 6, 'Only supports up to six types.');
+  var letters = 'ABCDEF';
+
+  return (types, covered) {
+    var spaces = types.map((type) => Space(type)).toList();
+
+    for (var i = 0; i < allTypes.length; i++) {
+      var value = Space(allTypes[i]);
+      if (covered.contains(letters[i])) {
+        expectExhaustive(value, spaces);
+      } else {
+        expectNotExhaustive(value, spaces);
+      }
+    }
+  };
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/report_errors_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/report_errors_test.dart
new file mode 100644
index 0000000..62da513
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/report_errors_test.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/exhaustive.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  // Here, "(_)" means "sealed". A bare name is unsealed.
+  //
+  //     (A)
+  //     / \
+  //   (B) (C)
+  //   / \   \
+  //  D   E   F
+  //         / \
+  //        G   H
+  var a = StaticType('A', isSealed: true);
+  var b = StaticType('B', isSealed: true, inherits: [a]);
+  var c = StaticType('C', isSealed: true, inherits: [a]);
+  var d = StaticType('D', inherits: [b]);
+  var e = StaticType('E', inherits: [b]);
+  var f = StaticType('F', inherits: [c]);
+  var g = StaticType('G', inherits: [f]);
+  var h = StaticType('H', inherits: [f]);
+
+  test('exhaustiveness', () {
+    // Case matching top type covers all subtypes.
+    expectReportErrors(a, [a]);
+    expectReportErrors(b, [a]);
+    expectReportErrors(d, [a]);
+
+    // Case matching subtype doesn't cover supertype.
+    expectReportErrors(a, [b], 'A is not exhaustively matched by B.');
+    expectReportErrors(b, [b]);
+    expectReportErrors(d, [b]);
+    expectReportErrors(e, [b]);
+
+    // Matching subtypes of sealed type is exhaustive.
+    expectReportErrors(a, [b, c]);
+    expectReportErrors(a, [d, e, f]);
+    expectReportErrors(a, [b, f]);
+    expectReportErrors(a, [c, d], 'A is not exhaustively matched by C|D.');
+    expectReportErrors(f, [g, h], 'F is not exhaustively matched by G|H.');
+  });
+
+  test('unreachable case', () {
+    // Same type.
+    expectReportErrors(b, [b, b], 'Case #2 B is covered by B.');
+
+    // Previous case is supertype.
+    expectReportErrors(b, [a, b], 'Case #2 B is covered by A.');
+
+    // Previous subtype cases cover sealed supertype.
+    expectReportErrors(a, [b, c, a], 'Case #3 A is covered by B|C.');
+    expectReportErrors(a, [d, e, f, a], 'Case #4 A is covered by D|E|F.');
+    expectReportErrors(a, [b, f, a], 'Case #3 A is covered by B|F.');
+    expectReportErrors(a, [c, d, a]);
+
+    // Previous subtype cases do not cover unsealed supertype.
+    expectReportErrors(f, [g, h, f]);
+  });
+
+  test('covered record destructuring', () {
+    var r = StaticType('R', fields: {'x': a, 'y': a, 'z': a});
+
+    // Wider field is not covered.
+    expectReportErrors(r, [
+      {'x': b},
+      {'x': a}
+    ]);
+
+    // Narrower field is covered.
+    expectReportErrors(
+        r,
+        [
+          {'x': a},
+          {'x': b}
+        ],
+        'Case #2 (x: B) is covered by (x: A).');
+  });
+
+  test('nullable sealed', () {
+    //     (A)
+    //     / \
+    //    B  (C)
+    //       / \
+    //      D   E
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', isSealed: true, inherits: [a]);
+    var d = StaticType('D', inherits: [c]);
+    var e = StaticType('E', inherits: [c]);
+
+    // Must cover null.
+    expectReportErrors(
+        a.nullable, [b, d, e], 'A? is not exhaustively matched by B|D|E.');
+
+    // Can cover null with any nullable subtype.
+    expectReportErrors(a.nullable, [b.nullable, c]);
+    expectReportErrors(a.nullable, [b, c.nullable]);
+    expectReportErrors(a.nullable, [b, d.nullable, e]);
+    expectReportErrors(a.nullable, [b, d, e.nullable]);
+
+    // Can cover null with a null space.
+    expectReportErrors(a.nullable, [b, c, StaticType.nullType]);
+    expectReportErrors(a.nullable, [b, d, e, StaticType.nullType]);
+
+    // Nullable covers the non-null.
+    expectReportErrors(
+        a.nullable, [a.nullable, a], 'Case #2 A is covered by A?.');
+    expectReportErrors(
+        b.nullable, [a.nullable, b], 'Case #2 B is covered by A?.');
+
+    // Nullable covers null.
+    expectReportErrors(a.nullable, [a.nullable, StaticType.nullType],
+        'Case #2 Null is covered by A?.');
+    expectReportErrors(b.nullable, [a.nullable, StaticType.nullType],
+        'Case #2 Null is covered by A?.');
+  });
+}
+
+void expectReportErrors(StaticType valueType, List<Object> cases,
+    [String errors = '']) {
+  expect(reportErrors(valueType, parseSpaces(cases)), errors);
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/static_type_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/static_type_test.dart
new file mode 100644
index 0000000..54df2c6
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/static_type_test.dart
@@ -0,0 +1,172 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('isSubtypeOf()', () {
+    var a = StaticType('A');
+    var b = StaticType('B', inherits: [a]);
+    var b2 = StaticType('B2', inherits: [a]);
+    var c = StaticType('C', inherits: [b]);
+    var d = StaticType('D', inherits: [c]);
+
+    test('subtype includes self', () {
+      expect(a.isSubtypeOf(a), isTrue);
+      expect(b.isSubtypeOf(b), isTrue);
+      expect(c.isSubtypeOf(c), isTrue);
+      expect(d.isSubtypeOf(d), isTrue);
+    });
+
+    test('immediate', () {
+      expect(a.isSubtypeOf(b), isFalse);
+      expect(b.isSubtypeOf(a), isTrue);
+
+      expect(b.isSubtypeOf(c), isFalse);
+      expect(c.isSubtypeOf(b), isTrue);
+
+      expect(c.isSubtypeOf(d), isFalse);
+      expect(d.isSubtypeOf(c), isTrue);
+    });
+
+    test('transitive', () {
+      expect(a.isSubtypeOf(c), isFalse);
+      expect(c.isSubtypeOf(a), isTrue);
+
+      expect(b.isSubtypeOf(d), isFalse);
+      expect(d.isSubtypeOf(b), isTrue);
+
+      expect(a.isSubtypeOf(d), isFalse);
+      expect(d.isSubtypeOf(a), isTrue);
+    });
+
+    test('unrelated', () {
+      expect(b.isSubtypeOf(b2), isFalse);
+      expect(b2.isSubtypeOf(b), isFalse);
+
+      expect(c.isSubtypeOf(b2), isFalse);
+      expect(b2.isSubtypeOf(c), isFalse);
+
+      expect(d.isSubtypeOf(b2), isFalse);
+      expect(b2.isSubtypeOf(d), isFalse);
+    });
+
+    test('multiple supertypes', () {
+      //      I1   I2   I3
+      //        \ /  \ /
+      //        I12  I23
+      //           \/
+      //          I123
+      var i1 = StaticType('I1');
+      var i2 = StaticType('I2');
+      var i3 = StaticType('I3');
+      var i12 = StaticType('I12', inherits: [i1, i2]);
+      var i23 = StaticType('I12', inherits: [i2, i3]);
+      var i123 = StaticType('I12', inherits: [i12, i23]);
+
+      expect(i1.isSubtypeOf(i2), isFalse);
+      expect(i2.isSubtypeOf(i1), isFalse);
+      expect(i2.isSubtypeOf(i3), isFalse);
+      expect(i3.isSubtypeOf(i2), isFalse);
+      expect(i1.isSubtypeOf(i3), isFalse);
+      expect(i3.isSubtypeOf(i1), isFalse);
+
+      expect(i1.isSubtypeOf(i12), isFalse);
+      expect(i12.isSubtypeOf(i1), isTrue);
+      expect(i2.isSubtypeOf(i12), isFalse);
+      expect(i12.isSubtypeOf(i2), isTrue);
+      expect(i3.isSubtypeOf(i12), isFalse);
+      expect(i12.isSubtypeOf(i3), isFalse);
+
+      expect(i1.isSubtypeOf(i23), isFalse);
+      expect(i23.isSubtypeOf(i1), isFalse);
+      expect(i2.isSubtypeOf(i23), isFalse);
+      expect(i23.isSubtypeOf(i2), isTrue);
+      expect(i3.isSubtypeOf(i23), isFalse);
+      expect(i23.isSubtypeOf(i3), isTrue);
+
+      expect(i1.isSubtypeOf(i123), isFalse);
+      expect(i123.isSubtypeOf(i1), isTrue);
+      expect(i2.isSubtypeOf(i123), isFalse);
+      expect(i123.isSubtypeOf(i2), isTrue);
+      expect(i3.isSubtypeOf(i123), isFalse);
+      expect(i123.isSubtypeOf(i3), isTrue);
+      expect(i12.isSubtypeOf(i123), isFalse);
+      expect(i123.isSubtypeOf(i12), isTrue);
+      expect(i23.isSubtypeOf(i123), isFalse);
+      expect(i123.isSubtypeOf(i23), isTrue);
+    });
+
+    test('nullable', () {
+      var a = StaticType('A');
+      var b = StaticType('B', inherits: [a]);
+
+      expect(StaticType.nullType.isSubtypeOf(a), isFalse);
+      expect(StaticType.nullType.isSubtypeOf(b), isFalse);
+      expect(StaticType.nullType.isSubtypeOf(a.nullable), isTrue);
+      expect(StaticType.nullType.isSubtypeOf(b.nullable), isTrue);
+
+      expect(a.isSubtypeOf(StaticType.nullType), isFalse);
+      expect(b.isSubtypeOf(StaticType.nullType), isFalse);
+      expect(a.nullable.isSubtypeOf(StaticType.nullType), isFalse);
+      expect(b.nullable.isSubtypeOf(StaticType.nullType), isFalse);
+
+      expect(a.isSubtypeOf(a.nullable), isTrue);
+      expect(a.nullable.isSubtypeOf(a), isFalse);
+      expect(a.nullable.isSubtypeOf(a.nullable), isTrue);
+
+      expect(a.isSubtypeOf(b.nullable), isFalse);
+      expect(a.nullable.isSubtypeOf(b), isFalse);
+      expect(a.nullable.isSubtypeOf(b.nullable), isFalse);
+
+      expect(b.isSubtypeOf(a.nullable), isTrue);
+      expect(b.nullable.isSubtypeOf(a), isFalse);
+      expect(b.nullable.isSubtypeOf(a.nullable), isTrue);
+    });
+  });
+
+  test('fields', () {
+    var a = StaticType('A');
+    var b = StaticType('B');
+    var c = StaticType('C', fields: {'x': a, 'y': b});
+    var d = StaticType('D', fields: {'w': a});
+    var e = StaticType('E', inherits: [c, d], fields: {'z': b});
+
+    expect(a.fields, isEmpty);
+    expect(b.fields, isEmpty);
+
+    expect(c.fields, hasLength(2));
+    expect(c.fields['x'], a);
+    expect(c.fields['y'], b);
+
+    // Fields are inherited.
+    expect(e.fields, hasLength(4));
+    expect(e.fields['x'], a);
+    expect(e.fields['y'], b);
+    expect(e.fields['w'], a);
+    expect(e.fields['z'], b);
+
+    // Overridden field types win.
+    var f = StaticType('F', fields: {'x': a});
+    var g = StaticType('G', inherits: [f], fields: {'x': b});
+    expect(g.fields, hasLength(1));
+    expect(g.fields['x'], b);
+  });
+
+  test('subtypes', () {
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [c]);
+
+    // Gets subtypes for sealed type.
+    var aSubtypes = a.subtypes.toList();
+    expect(aSubtypes, unorderedEquals([b, c]));
+
+    // And unsealed.
+    var cSubtypes = c.subtypes.toList();
+    expect(cSubtypes, unorderedEquals([d]));
+  });
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/subtract_test.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/subtract_test.dart
new file mode 100644
index 0000000..5a09217
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/subtract_test.dart
@@ -0,0 +1,253 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/subtract.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  group('empty', () {
+    var a = StaticType('A');
+    var b = StaticType('B', inherits: [a], fields: {'x': a, 'y': a});
+    var c = StaticType('C', inherits: [a]);
+
+    expectSubtract('∅', '∅', '∅');
+
+    // Subtracting from empty stays empty.
+    expectSubtract('∅', a, '∅');
+    expectSubtract('∅', [b, c], '∅');
+    expectSubtract('∅', {'x': a}, '∅');
+    expectSubtract('∅', ty(b, {'x': a}), '∅');
+
+    // Subtracting empty leaves unchanged.
+    expectSubtract(a, '∅', 'A');
+    expectSubtract([b, c], '∅', 'B|C');
+    expectSubtract({'x': a}, '∅', '(x: A)');
+    expectSubtract(ty(b, {'x': a}), '∅', 'B(x: A)');
+  });
+
+  group('union with sealed types', () {
+    //   (A)
+    //   /|\
+    //  B C(D)
+    //     / \
+    //    E   F
+    var a = StaticType('A', isSealed: true);
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', isSealed: true, inherits: [a]);
+    var e = StaticType('E', inherits: [d]);
+    var f = StaticType('F', inherits: [d]);
+
+    expectSubtract(a, b, 'C|D');
+    expectSubtract(a, c, 'B|D');
+    expectSubtract(a, d, 'B|C');
+    expectSubtract(a, e, 'B|C|F');
+    expectSubtract(a, f, 'B|C|E');
+    expectSubtract(a, [b, c], 'D');
+    expectSubtract(a, [b, d], 'C');
+    expectSubtract(a, [b, e], 'C|F');
+
+    expectSubtract([b, c], b, 'C');
+    expectSubtract([b, c], c, 'B');
+    expectSubtract([b, c, d], b, 'C|D');
+    expectSubtract([b, c, d], c, 'B|D');
+    expectSubtract([b, c, d], d, 'B|C');
+
+    expectSubtract([b, c], [b, c], '∅');
+    expectSubtract([b, c], [b, d], 'C');
+    expectSubtract([b, d], [b, c], 'D');
+    expectSubtract([b, c, d], [b, c], 'D');
+
+    expectSubtract([b, d], e, 'B|F');
+    expectSubtract([b, e], d, 'B');
+  });
+
+  group('unsealed subtype', () {
+    //   A   B
+    //  / \ /
+    // C   D
+    //  \ /
+    //   E
+    var a = StaticType('A');
+    var b = StaticType('B');
+    var c = StaticType('C', inherits: [a]);
+    var d = StaticType('D', inherits: [a, b]);
+    var e = StaticType('E', inherits: [c, d]);
+
+    expectSubtract(a, a, '∅');
+    expectSubtract(a, b, 'A');
+    expectSubtract(a, c, 'A');
+    expectSubtract(a, d, 'A');
+    expectSubtract(a, e, 'A');
+
+    expectSubtract(b, a, 'B');
+    expectSubtract(b, b, '∅');
+    expectSubtract(b, c, 'B');
+    expectSubtract(b, d, 'B');
+    expectSubtract(b, e, 'B');
+
+    expectSubtract(c, a, '∅');
+    expectSubtract(c, b, 'C');
+    expectSubtract(c, c, '∅');
+    expectSubtract(c, d, 'C');
+    expectSubtract(c, e, 'C');
+
+    expectSubtract(d, a, '∅');
+    expectSubtract(d, b, '∅');
+    expectSubtract(d, c, 'D');
+    expectSubtract(d, d, '∅');
+    expectSubtract(d, e, 'D');
+
+    expectSubtract(e, a, '∅');
+    expectSubtract(e, b, '∅');
+    expectSubtract(e, c, '∅');
+    expectSubtract(e, d, '∅');
+    expectSubtract(e, e, '∅');
+  });
+
+  group('unsealed subtype and field', () {
+    //  X  A
+    //  |  |
+    //  Y  B
+    var x = StaticType('X');
+    var y = StaticType('Y', inherits: [x]);
+    var a = StaticType('A', fields: {'x': StaticType.top});
+    var b = StaticType('B', inherits: [a]);
+
+    Space A({required StaticType x}) => ty(a, {'x': x});
+    Space B({required StaticType x}) => ty(b, {'x': x});
+
+    expectSubtract(A(x: x), A(x: x), '∅');
+    expectSubtract(A(x: x), B(x: x), 'A(x: X)');
+    expectSubtract(B(x: x), A(x: x), '∅');
+    expectSubtract(B(x: x), B(x: x), '∅');
+
+    expectSubtract(A(x: x), A(x: y), 'A(x: X)');
+    expectSubtract(A(x: x), B(x: y), 'A(x: X)');
+    expectSubtract(B(x: x), A(x: y), 'B(x: X)');
+    expectSubtract(B(x: x), B(x: y), 'B(x: X)');
+
+    expectSubtract(A(x: y), A(x: x), '∅');
+    expectSubtract(A(x: y), B(x: x), 'A(x: Y)');
+    expectSubtract(B(x: y), A(x: x), '∅');
+    expectSubtract(B(x: y), B(x: x), '∅');
+
+    expectSubtract(A(x: y), A(x: y), '∅');
+    expectSubtract(A(x: y), B(x: y), 'A(x: Y)');
+    expectSubtract(B(x: y), A(x: y), '∅');
+    expectSubtract(B(x: y), B(x: y), '∅');
+
+    expectSubtract(A(x: x), a, '∅');
+    expectSubtract(A(x: x), b, 'A(x: X)');
+    expectSubtract(B(x: x), a, '∅');
+    expectSubtract(B(x: x), b, '∅');
+    expectSubtract(a, A(x: x), 'A');
+    expectSubtract(b, A(x: x), 'B');
+    expectSubtract(a, B(x: x), 'A');
+    expectSubtract(b, B(x: x), 'B');
+  });
+
+  group('sealed subtype and field', () {
+    //   (X)    (A)
+    //   /|\    /|\
+    //  W Y Z  B C D
+    var x = StaticType('X', isSealed: true);
+    StaticType('W', inherits: [x]);
+    var y = StaticType('Y', inherits: [x]);
+    StaticType('Z', inherits: [x]);
+    var a = StaticType('A', isSealed: true, fields: {'x': StaticType.top});
+    var b = StaticType('B', inherits: [a]);
+    StaticType('C', inherits: [a]);
+    StaticType('D', inherits: [a]);
+
+    Space A({required StaticType x}) => ty(a, {'x': x});
+    Space B({required StaticType x}) => ty(b, {'x': x});
+
+    expectSubtract(A(x: x), A(x: x), '∅');
+    expectSubtract(A(x: x), B(x: x), 'C(x: X)|D(x: X)');
+    expectSubtract(B(x: x), A(x: x), '∅');
+    expectSubtract(B(x: x), B(x: x), '∅');
+
+    expectSubtract(A(x: x), A(x: y), 'A(x: W|Z)');
+    expectSubtract(A(x: x), B(x: y), 'B(x: W|Z)|C(x: X)|D(x: X)');
+    expectSubtract(B(x: x), A(x: y), 'B(x: W|Z)');
+    expectSubtract(B(x: x), B(x: y), 'B(x: W|Z)');
+
+    expectSubtract(A(x: y), A(x: x), '∅');
+    expectSubtract(A(x: y), B(x: x), 'C(x: Y)|D(x: Y)');
+    expectSubtract(B(x: y), A(x: x), '∅');
+    expectSubtract(B(x: y), B(x: x), '∅');
+
+    expectSubtract(A(x: y), A(x: y), '∅');
+    expectSubtract(A(x: y), B(x: y), 'C(x: Y)|D(x: Y)');
+    expectSubtract(B(x: y), A(x: y), '∅');
+    expectSubtract(B(x: y), B(x: y), '∅');
+
+    expectSubtract(A(x: x), a, '∅');
+    expectSubtract(A(x: x), b, 'C(x: X)|D(x: X)');
+    expectSubtract(B(x: x), a, '∅');
+    expectSubtract(B(x: x), b, '∅');
+
+    // Note that these don't specialize x to "W|Z" because it's declared type
+    // is top, which isn't sealed.
+    expectSubtract(a, A(x: x), 'A');
+    expectSubtract(b, A(x: x), 'B');
+    expectSubtract(a, B(x: x), 'B|C|D');
+    expectSubtract(b, B(x: x), 'B');
+  });
+
+  group('sealed subtype and field', () {
+    //   (X)    (A)
+    //   /|\    /|\
+    //  W Y Z  B C D
+    var x = StaticType('X', isSealed: true);
+    var w = StaticType('W', inherits: [x]);
+    var y = StaticType('Y', inherits: [x]);
+    var z = StaticType('Z', inherits: [x]);
+    var a = StaticType('A', isSealed: true, fields: {'x': x, 'y': x, 'z': x});
+    var b = StaticType('B', inherits: [a]);
+    var c = StaticType('C', inherits: [a]);
+    StaticType('D', inherits: [a]);
+
+    Space A({StaticType? x, StaticType? y, StaticType? z}) => ty(a,
+        {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+    Space B({StaticType? x, StaticType? y, StaticType? z}) => ty(b,
+        {if (x != null) 'x': x, if (y != null) 'y': y, if (z != null) 'z': z});
+
+    // Fields only on left.
+    expectSubtract(A(x: x, y: y), a, '∅');
+    expectSubtract(A(x: x, y: y), b, 'C(x: X, y: Y)|D(x: X, y: Y)');
+    expectSubtract(B(x: x, y: y), a, '∅');
+    expectSubtract(B(x: x, y: y), c, 'B(x: X, y: Y)');
+
+    expectSubtract(A(x: w, y: z), a, '∅');
+    expectSubtract(A(x: w, y: z), b, 'C(x: W, y: Z)|D(x: W, y: Z)');
+    expectSubtract(B(x: w, y: z), a, '∅');
+    expectSubtract(B(x: w, y: z), c, 'B(x: W, y: Z)');
+
+    // Fields only on right.
+    expectSubtract(a, A(x: x, y: y), 'A(x: X, y: W|Z)');
+    expectSubtract(b, A(x: x, y: y), 'B(x: X, y: W|Z)');
+    expectSubtract(a, B(x: x, y: y), 'B(x: X, y: W|Z)|C|D');
+    expectSubtract(c, B(x: x, y: y), 'C');
+
+    expectSubtract(a, A(x: w, y: z), 'A(x: Y|Z, y: X)|A(x: X, y: W|Y)');
+    expectSubtract(b, A(x: w, y: z), 'B(x: Y|Z, y: X)|B(x: X, y: W|Y)');
+    expectSubtract(a, B(x: w, y: z), 'B(x: Y|Z, y: X)|B(x: X, y: W|Y)|C|D');
+    expectSubtract(c, B(x: w, y: z), 'C');
+  });
+}
+
+void expectSubtract(Object left, Object right, String expected) {
+  var leftSpace = parseSpace(left);
+  var rightSpace = parseSpace(right);
+  test('$leftSpace - $rightSpace', () {
+    var result = subtract(leftSpace, rightSpace);
+    expect(result.toString(), expected);
+  });
+}
diff --git a/pkg/_fe_analyzer_shared/test/exhaustiveness/utils.dart b/pkg/_fe_analyzer_shared/test/exhaustiveness/utils.dart
new file mode 100644
index 0000000..10cc5be
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/exhaustiveness/utils.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2022, 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:_fe_analyzer_shared/src/exhaustiveness/exhaustive.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/space.dart';
+import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
+import 'package:test/test.dart';
+
+/// Test that [spaces] is exhaustive over [value].
+void expectExhaustive(Space value, List<Space> spaces) {
+  _expectExhaustive(value, spaces, true);
+}
+
+/// Test that [cases] are exhaustive over [type] if and only if all cases are
+/// included and that all subsets of the cases are not exhaustive.
+void expectExhaustiveOnlyAll(StaticType type, List<Object> cases) {
+  _testCases(type, cases, true);
+}
+
+/// Test that [cases] are not exhaustive over [type]. Also test that omitting
+/// each case is still not exhaustive.
+void expectNeverExhaustive(StaticType type, List<Object> cases) {
+  _testCases(type, cases, false);
+}
+
+/// Test that [spaces] is not exhaustive over [value].
+void expectNotExhaustive(Space value, List<Space> spaces) {
+  _expectExhaustive(value, spaces, false);
+}
+
+Map<String, Space> fieldsToSpace(Map<String, Object> fields) =>
+    fields.map((key, value) => MapEntry(key, parseSpace(value)));
+
+Space parseSpace(Object object) {
+  if (object is Space) return object;
+  if (object == '∅') return Space.empty;
+  if (object is StaticType) return Space(object);
+  if (object is List<Object>) {
+    return Space.union(object.map(parseSpace).toList());
+  }
+  if (object is Map<String, Object>) {
+    return Space.record(fieldsToSpace(object));
+  }
+
+  throw ArgumentError('Invalid space $object');
+}
+
+/// Parse a list of spaces using [parseSpace].
+List<Space> parseSpaces(List<Object> objects) =>
+    objects.map(parseSpace).toList();
+
+/// Make a record space with the given fields.
+Space rec({Object? w, Object? x, Object? y, Object? z}) => Space.record({
+      if (w != null) 'w': parseSpace(w),
+      if (x != null) 'x': parseSpace(x),
+      if (y != null) 'y': parseSpace(y),
+      if (z != null) 'z': parseSpace(z)
+    });
+
+/// Make a [Space] with [type] and [fields].
+Space ty(StaticType type, Map<String, Object> fields) =>
+    Space(type, fieldsToSpace(fields));
+
+void _checkExhaustive(Space value, List<Space> spaces, bool expectation) {
+  var actual = isExhaustive(value, spaces);
+  if (expectation != actual) {
+    if (expectation) {
+      fail('Expected $spaces to cover $value but did not.');
+    } else {
+      fail('Expected $spaces to not cover $value but did.');
+    }
+  }
+}
+
+void _expectExhaustive(Space value, List<Space> spaces, bool expectation) {
+  test(
+      '$value - ${spaces.join(' - ')} ${expectation ? 'is' : 'is not'} '
+      'exhaustive', () {
+    _checkExhaustive(value, spaces, expectation);
+  });
+}
+
+/// Test that [cases] are not exhaustive over [type].
+void _testCases(StaticType type, List<Object> cases, bool expectation) {
+  var valueSpace = Space(type);
+  var spaces = parseSpaces(cases);
+
+  test('$type with all cases', () {
+    _checkExhaustive(valueSpace, spaces, expectation);
+  });
+
+  // With any single case removed, should also not be exhaustive.
+  for (var i = 0; i < spaces.length; i++) {
+    var filtered = spaces.toList();
+    filtered.removeAt(i);
+
+    test('$type without case ${spaces[i]}', () {
+      _checkExhaustive(valueSpace, filtered, false);
+    });
+  }
+}
diff --git a/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart b/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart
index 324a97d..e4ede99 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart
@@ -120,8 +120,7 @@
               signatureType.declaredNullability,
               namedParameters: signatureType.namedParameters,
               typeParameters: signatureType.typeParameters,
-              requiredParameterCount: signatureType.requiredParameterCount,
-              typedefType: signatureType.typedefType);
+              requiredParameterCount: signatureType.requiredParameterCount);
         }
         return newProcedure;
       }
diff --git a/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart b/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
index f98377e..71a53d6 100644
--- a/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
+++ b/pkg/analysis_server/lib/src/services/snippets/dart/flutter_snippet_producers.dart
@@ -218,8 +218,8 @@
             returnType: VoidTypeImpl.instance,
             bodyWriter: () {
               builder.writeln('{');
-              builder.writeln('    super.dispose();');
               builder.writeln('    _controller.dispose();');
+              builder.writeln('    super.dispose();');
               builder.writeln('  }');
             },
           );
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 40f2f70..ff5a000 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -2959,8 +2959,8 @@
 
   @override
   void dispose() {
-    super.dispose();
     _controller.dispose();
+    super.dispose();
   }
 
   @override
diff --git a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
index 16423ce..61a2ca0 100644
--- a/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
+++ b/pkg/analysis_server/test/services/snippets/dart/flutter_snippet_producers_test.dart
@@ -211,8 +211,8 @@
 
   @override
   void dispose() {
-    super.dispose();
     _controller.dispose();
+    super.dispose();
   }
 
   @override
@@ -263,8 +263,8 @@
 
   @override
   void dispose() {
-    super.dispose();
     _controller.dispose();
+    super.dispose();
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index d089ded..e695ae7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -35,7 +35,7 @@
 import 'package:analyzer/src/error/todo_finder.dart';
 import 'package:analyzer/src/error/unicode_text_verifier.dart';
 import 'package:analyzer/src/error/unused_local_elements_verifier.dart';
-import 'package:analyzer/src/generated/declaration_resolver.dart';
+import 'package:analyzer/src/generated/element_walker.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/ffi_verifier.dart';
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 71e14b9..7e108f6 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -33,7 +33,7 @@
 import 'package:analyzer/src/error/todo_finder.dart';
 import 'package:analyzer/src/error/unicode_text_verifier.dart';
 import 'package:analyzer/src/error/unused_local_elements_verifier.dart';
-import 'package:analyzer/src/generated/declaration_resolver.dart';
+import 'package:analyzer/src/generated/element_walker.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index cb2de85..781f48e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -21,7 +21,7 @@
 import 'package:analyzer/src/dart/resolver/named_type_resolver.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/declaration_resolver.dart';
+import 'package:analyzer/src/generated/element_walker.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
 class ElementHolder {
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/element_walker.dart
similarity index 87%
rename from pkg/analyzer/lib/src/generated/declaration_resolver.dart
rename to pkg/analyzer/lib/src/generated/element_walker.dart
index 041fc62..aafabade 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_walker.dart
@@ -2,9 +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.
 
-// See: https://github.com/dart-lang/linter/issues/3345
-// ignore_for_file: prefer_initializing_formals
-
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 
@@ -41,9 +38,8 @@
 
   /// Creates an [ElementWalker] which walks the child elements of a class
   /// element.
-  ElementWalker.forClass(ClassElement element)
-      : element = element,
-        _accessors = element.accessors.where(_isNotSynthetic).toList(),
+  ElementWalker.forClass(ClassElement this.element)
+      : _accessors = element.accessors.where(_isNotSynthetic).toList(),
         _constructors = element.isMixinApplication
             ? null
             : element.constructors.where(_isNotSynthetic).toList(),
@@ -53,10 +49,9 @@
 
   /// Creates an [ElementWalker] which walks the child elements of a compilation
   /// unit element.
-  ElementWalker.forCompilationUnit(CompilationUnitElementImpl element,
+  ElementWalker.forCompilationUnit(CompilationUnitElementImpl this.element,
       {this.libraryFilePath, this.unitFilePath})
-      : element = element,
-        _accessors = element.accessors.where(_isNotSynthetic).toList(),
+      : _accessors = element.accessors.where(_isNotSynthetic).toList(),
         _classes = element.classes,
         _enums = element.enums,
         _extensions = element.extensions,
@@ -67,46 +62,40 @@
 
   /// Creates an [ElementWalker] which walks the child elements of a compilation
   /// unit element.
-  ElementWalker.forExecutable(ExecutableElement element)
-      : element = element,
-        _functions = const <ExecutableElement>[],
+  ElementWalker.forExecutable(ExecutableElement this.element)
+      : _functions = const <ExecutableElement>[],
         _parameters = element.parameters,
         _typeParameters = element.typeParameters;
 
   /// Creates an [ElementWalker] which walks the child elements of an extension
   /// element.
-  ElementWalker.forExtension(ExtensionElement element)
-      : element = element,
-        _accessors = element.accessors.where(_isNotSynthetic).toList(),
+  ElementWalker.forExtension(ExtensionElement this.element)
+      : _accessors = element.accessors.where(_isNotSynthetic).toList(),
         _functions = element.methods,
         _typeParameters = element.typeParameters,
         _variables = element.fields.where(_isNotSynthetic).toList();
 
   /// Creates an [ElementWalker] which walks the child elements of a typedef
   /// element.
-  ElementWalker.forGenericFunctionType(GenericFunctionTypeElement element)
-      : element = element,
-        _parameters = element.parameters,
+  ElementWalker.forGenericFunctionType(GenericFunctionTypeElement this.element)
+      : _parameters = element.parameters,
         _typeParameters = element.typeParameters;
 
   /// Creates an [ElementWalker] which walks the child elements of a typedef
   /// element defined using a generic function type.
-  ElementWalker.forGenericTypeAlias(TypeAliasElement element)
-      : element = element,
-        _typeParameters = element.typeParameters;
+  ElementWalker.forGenericTypeAlias(TypeAliasElement this.element)
+      : _typeParameters = element.typeParameters;
 
   /// Creates an [ElementWalker] which walks the child elements of a parameter
   /// element.
-  ElementWalker.forParameter(ParameterElement element)
-      : element = element,
-        _parameters = element.parameters,
+  ElementWalker.forParameter(ParameterElement this.element)
+      : _parameters = element.parameters,
         _typeParameters = element.typeParameters;
 
   /// Creates an [ElementWalker] which walks the child elements of a typedef
   /// element.
-  ElementWalker.forTypedef(TypeAliasElement element)
-      : element = element,
-        _parameters =
+  ElementWalker.forTypedef(TypeAliasElement this.element)
+      : _parameters =
             (element.aliasedElement as GenericFunctionTypeElement).parameters,
         _typeParameters = element.typeParameters;
 
diff --git a/pkg/compiler/lib/src/common/elements.dart b/pkg/compiler/lib/src/common/elements.dart
index 482fe9a..a66fe73 100644
--- a/pkg/compiler/lib/src/common/elements.dart
+++ b/pkg/compiler/lib/src/common/elements.dart
@@ -2,280 +2,145 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.10
-
 import '../common.dart';
-import '../constants/common_elements_for_constants.dart'
-    as common_elements_for_constants;
 import '../constants/constant_system.dart' as constant_system;
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../inferrer/abstract_value_domain.dart';
-import '../js_backend/native_data.dart' show NativeBasicData;
-import '../js_model/locals.dart';
+import '../js_backend/native_data_interfaces.dart' show NativeBasicData;
+import '../js_model/locals_interfaces.dart';
 import '../universe/selector.dart' show Selector;
 
 import 'names.dart' show Identifiers, Uris;
 
 /// The common elements and types in Dart.
-abstract class CommonElements
-    implements
-        CommonElementsForDartTypes,
-        common_elements_for_constants.CommonElements {
-  @override
+abstract class CommonElements {
   final DartTypes dartTypes;
   final ElementEnvironment _env;
-  ClassEntity _objectClass;
-  ClassEntity _boolClass;
-  ClassEntity _numClass;
-  ClassEntity _intClass;
-  ClassEntity _doubleClass;
-  ClassEntity _stringClass;
-  ClassEntity _functionClass;
-  ClassEntity _resourceClass;
-  ClassEntity _symbolClass;
-  ClassEntity _nullClass;
-  ClassEntity _typeClass;
-  ClassEntity _stackTraceClass;
-  ClassEntity _listClass;
-  ClassEntity _setClass;
-  ClassEntity _mapClass;
-  ClassEntity _unmodifiableSetClass;
-  ClassEntity _iterableClass;
-  ClassEntity _futureClass;
-  ClassEntity _streamClass;
-  LibraryEntity _coreLibrary;
-  LibraryEntity _asyncLibrary;
-  LibraryEntity _mirrorsLibrary;
-  LibraryEntity _typedDataLibrary;
-  LibraryEntity _jsHelperLibrary;
-  LibraryEntity _lateHelperLibrary;
-  LibraryEntity _foreignLibrary;
-  LibraryEntity _rtiLibrary;
-  LibraryEntity _interceptorsLibrary;
-  LibraryEntity _internalLibrary;
-  LibraryEntity _dartJsAnnotationsLibrary;
-  LibraryEntity _dartJsLibrary;
-  LibraryEntity _packageJsLibrary;
-  ClassEntity _typedDataClass;
-  ConstructorEntity _symbolConstructorTarget;
+  ClassEntity? _symbolClass;
+  ConstructorEntity? _symbolConstructorTarget;
   bool _computedSymbolConstructorDependencies = false;
-  ConstructorEntity _symbolConstructorImplementationTarget;
-  FunctionEntity _identicalFunction;
-  ClassEntity _mapLiteralClass;
-  ConstructorEntity _mapLiteralConstructor;
-  ConstructorEntity _mapLiteralConstructorEmpty;
-  FunctionEntity _mapLiteralUntypedMaker;
-  FunctionEntity _mapLiteralUntypedEmptyMaker;
-  ClassEntity _setLiteralClass;
-  ConstructorEntity _setLiteralConstructor;
-  ConstructorEntity _setLiteralConstructorEmpty;
-  FunctionEntity _setLiteralUntypedMaker;
-  FunctionEntity _setLiteralUntypedEmptyMaker;
-  FunctionEntity _objectNoSuchMethod;
-  FunctionEntity _syncStarIterableFactory;
-  FunctionEntity _asyncAwaitCompleterFactory;
-  FunctionEntity _asyncStarStreamControllerFactory;
-  ClassEntity _jsInterceptorClass;
-  ClassEntity _jsStringClass;
-  ClassEntity _jsArrayClass;
-  ClassEntity _jsNumberClass;
-  ClassEntity _jsIntClass;
-  ClassEntity _jsNumNotIntClass;
-  ClassEntity _jsNullClass;
-  ClassEntity _jsBoolClass;
-  ClassEntity _jsPlainJavaScriptObjectClass;
-  ClassEntity _jsUnknownJavaScriptObjectClass;
-  ClassEntity _jsJavaScriptFunctionClass;
-  ClassEntity _jsLegacyJavaScriptObjectClass;
-  ClassEntity _jsJavaScriptObjectClass;
-  ClassEntity _jsIndexableClass;
-  ClassEntity _jsMutableIndexableClass;
-  ClassEntity _jsMutableArrayClass;
-  ClassEntity _jsFixedArrayClass;
-  ClassEntity _jsExtendableArrayClass;
-  ClassEntity _jsUnmodifiableArrayClass;
-  ClassEntity _jsPositiveIntClass;
-  ClassEntity _jsUInt32Class;
-  ClassEntity _jsUInt31Class;
-  FunctionEntity _getNativeInterceptorMethod;
-  ConstructorEntity _jsArrayTypedConstructor;
-  ClassEntity _closureClass;
-  ClassEntity _closureClass0Args;
-  ClassEntity _closureClass2Args;
-  ClassEntity _boundClosureClass;
-  ClassEntity _typeLiteralClass;
-  ClassEntity _constMapLiteralClass;
-  ClassEntity _constSetLiteralClass;
-  ClassEntity _jsInvocationMirrorClass;
-  ClassEntity _requiredSentinelClass;
-  MemberEntity _invocationTypeArgumentGetter;
-  ClassEntity _jsIndexingBehaviorInterface;
-  ClassEntity _nativeAnnotationClass;
-  FunctionEntity _assertTest;
-  FunctionEntity _assertThrow;
-  FunctionEntity _assertHelper;
-  FunctionEntity _assertUnreachableMethod;
-  FunctionEntity _getIsolateAffinityTagMarker;
-  FunctionEntity _requiresPreambleMarker;
-  FunctionEntity _rawStartupMetrics;
-  FunctionEntity _setArrayType;
-  FunctionEntity _findType;
-  FunctionEntity _instanceType;
-  FunctionEntity _arrayInstanceType;
-  FunctionEntity _simpleInstanceType;
-  FunctionEntity _typeLiteralMaker;
-  FunctionEntity _checkTypeBound;
-  FieldEntity _rtiAsField;
-  FieldEntity _rtiIsField;
-  FieldEntity _rtiRestField;
-  FieldEntity _rtiPrecomputed1Field;
-  FunctionEntity _rtiEvalMethod;
-  FunctionEntity _rtiBindMethod;
-  FunctionEntity _rtiAddRulesMethod;
-  FunctionEntity _rtiAddErasedTypesMethod;
-  FunctionEntity _rtiAddTypeParameterVariancesMethod;
-  FunctionEntity _generalIsTestImplementation;
-  FunctionEntity _generalAsCheckImplementation;
-  FunctionEntity _generalNullableAsCheckImplementation;
-  FunctionEntity _specializedIsObject;
-  FunctionEntity _specializedAsObject;
-  FunctionEntity _generalNullableIsTestImplementation;
-  ClassEntity _symbolImplementationClass;
-  ClassEntity _externalNameClass;
-  ClassEntity _jsGetNameEnum;
-  FunctionEntity _jsAllowInterop1;
-  FunctionEntity _jsAllowInterop2;
-  FieldEntity _symbolImplementationField;
-  FunctionEntity _cachedCheckConcurrentModificationError;
+  ConstructorEntity? _symbolConstructorImplementationTarget;
+  ClassEntity? _mapLiteralClass;
+  ClassEntity? _symbolImplementationClass;
+  FieldEntity? _symbolImplementationField;
 
   CommonElements(this.dartTypes, this._env);
 
   /// The `Object` class defined in 'dart:core'.
-  ClassEntity get objectClass =>
-      _objectClass ??= _findClass(coreLibrary, 'Object');
+  late final ClassEntity objectClass = _findClass(coreLibrary, 'Object')!;
 
   /// The `bool` class defined in 'dart:core'.
-  ClassEntity get boolClass => _boolClass ??= _findClass(coreLibrary, 'bool');
+  late final ClassEntity boolClass = _findClass(coreLibrary, 'bool')!;
 
   /// The `num` class defined in 'dart:core'.
-  ClassEntity get numClass => _numClass ??= _findClass(coreLibrary, 'num');
+  late final ClassEntity numClass = _findClass(coreLibrary, 'num')!;
 
   /// The `int` class defined in 'dart:core'.
-  ClassEntity get intClass => _intClass ??= _findClass(coreLibrary, 'int');
+  late final ClassEntity intClass = _findClass(coreLibrary, 'int')!;
 
   /// The `double` class defined in 'dart:core'.
-  ClassEntity get doubleClass =>
-      _doubleClass ??= _findClass(coreLibrary, 'double');
+  late final ClassEntity doubleClass = _findClass(coreLibrary, 'double')!;
 
   /// The `String` class defined in 'dart:core'.
-  ClassEntity get stringClass =>
-      _stringClass ??= _findClass(coreLibrary, 'String');
+  late final ClassEntity stringClass = _findClass(coreLibrary, 'String')!;
 
   /// The `Function` class defined in 'dart:core'.
-  ClassEntity get functionClass =>
-      _functionClass ??= _findClass(coreLibrary, 'Function');
+  late final ClassEntity functionClass = _findClass(coreLibrary, 'Function')!;
 
   /// The `Resource` class defined in 'dart:core'.
-  ClassEntity get resourceClass =>
-      _resourceClass ??= _findClass(coreLibrary, 'Resource');
+  late final ClassEntity resourceClass = _findClass(coreLibrary, 'Resource')!;
 
   /// The `Symbol` class defined in 'dart:core'.
-  ClassEntity get symbolClass =>
-      _symbolClass ??= _findClass(coreLibrary, 'Symbol');
+  late final ClassEntity symbolClass = _findClass(coreLibrary, 'Symbol')!;
 
   /// The `Null` class defined in 'dart:core'.
-  ClassEntity get nullClass => _nullClass ??= _findClass(coreLibrary, 'Null');
+  late final ClassEntity nullClass = _findClass(coreLibrary, 'Null')!;
 
   /// The `Type` class defined in 'dart:core'.
-  ClassEntity get typeClass => _typeClass ??= _findClass(coreLibrary, 'Type');
+  late final ClassEntity typeClass = _findClass(coreLibrary, 'Type')!;
 
   /// The `StackTrace` class defined in 'dart:core';
-  ClassEntity get stackTraceClass =>
-      _stackTraceClass ??= _findClass(coreLibrary, 'StackTrace');
+  late final ClassEntity stackTraceClass =
+      _findClass(coreLibrary, 'StackTrace')!;
 
   /// The `List` class defined in 'dart:core';
-  ClassEntity get listClass => _listClass ??= _findClass(coreLibrary, 'List');
+  late final ClassEntity listClass = _findClass(coreLibrary, 'List')!;
 
   /// The `Set` class defined in 'dart:core';
-  ClassEntity get setClass => _setClass ??= _findClass(coreLibrary, 'Set');
+  late final ClassEntity setClass = _findClass(coreLibrary, 'Set')!;
 
   /// The `Map` class defined in 'dart:core';
-  ClassEntity get mapClass => _mapClass ??= _findClass(coreLibrary, 'Map');
+  late final ClassEntity mapClass = _findClass(coreLibrary, 'Map')!;
 
   /// The `Set` class defined in 'dart:core';
-  ClassEntity get unmodifiableSetClass => _unmodifiableSetClass ??=
-      _findClass(_env.lookupLibrary(Uris.dart_collection), '_UnmodifiableSet');
+  late final ClassEntity unmodifiableSetClass =
+      _findClass(_env.lookupLibrary(Uris.dart_collection), '_UnmodifiableSet')!;
 
   /// The `Iterable` class defined in 'dart:core';
-  ClassEntity get iterableClass =>
-      _iterableClass ??= _findClass(coreLibrary, 'Iterable');
+  late final ClassEntity iterableClass = _findClass(coreLibrary, 'Iterable')!;
 
   /// The `Future` class defined in 'async';.
-  ClassEntity get futureClass =>
-      _futureClass ??= _findClass(asyncLibrary, 'Future');
+  late final ClassEntity futureClass = _findClass(asyncLibrary, 'Future')!;
 
   /// The `Stream` class defined in 'async';
-  ClassEntity get streamClass =>
-      _streamClass ??= _findClass(asyncLibrary, 'Stream');
+  late final ClassEntity streamClass = _findClass(asyncLibrary, 'Stream')!;
 
   /// The dart:core library.
-  LibraryEntity get coreLibrary =>
-      _coreLibrary ??= _env.lookupLibrary(Uris.dart_core, required: true);
+  late final LibraryEntity coreLibrary =
+      _env.lookupLibrary(Uris.dart_core, required: true)!;
 
   /// The dart:async library.
-  LibraryEntity get asyncLibrary =>
-      _asyncLibrary ??= _env.lookupLibrary(Uris.dart_async);
+  late final LibraryEntity? asyncLibrary = _env.lookupLibrary(Uris.dart_async);
 
   /// The dart:mirrors library.
   /// Null if the program doesn't access dart:mirrors.
-  LibraryEntity get mirrorsLibrary =>
-      _mirrorsLibrary ??= _env.lookupLibrary(Uris.dart_mirrors);
+  late final LibraryEntity? mirrorsLibrary =
+      _env.lookupLibrary(Uris.dart_mirrors);
 
   /// The dart:typed_data library.
-  LibraryEntity get typedDataLibrary =>
-      _typedDataLibrary ??= _env.lookupLibrary(Uris.dart__native_typed_data);
+  late final LibraryEntity? typedDataLibrary =
+      _env.lookupLibrary(Uris.dart__native_typed_data);
 
   /// The dart:_js_helper library.
-  LibraryEntity get jsHelperLibrary =>
-      _jsHelperLibrary ??= _env.lookupLibrary(Uris.dart__js_helper);
+  late final LibraryEntity? jsHelperLibrary =
+      _env.lookupLibrary(Uris.dart__js_helper);
 
   /// The dart:_late_helper library
-  LibraryEntity get lateHelperLibrary =>
-      _lateHelperLibrary ??= _env.lookupLibrary(Uris.dart__late_helper);
+  late final LibraryEntity? lateHelperLibrary =
+      _env.lookupLibrary(Uris.dart__late_helper);
 
   /// The dart:_interceptors library.
-  LibraryEntity get interceptorsLibrary =>
-      _interceptorsLibrary ??= _env.lookupLibrary(Uris.dart__interceptors);
+  late final LibraryEntity? interceptorsLibrary =
+      _env.lookupLibrary(Uris.dart__interceptors);
 
   /// The dart:_foreign_helper library.
-  LibraryEntity get foreignLibrary =>
-      _foreignLibrary ??= _env.lookupLibrary(Uris.dart__foreign_helper);
+  late final LibraryEntity? foreignLibrary =
+      _env.lookupLibrary(Uris.dart__foreign_helper);
 
   /// The dart:_rti library.
-  LibraryEntity get rtiLibrary =>
-      _rtiLibrary ??= _env.lookupLibrary(Uris.dart__rti, required: true);
+  late final LibraryEntity rtiLibrary =
+      _env.lookupLibrary(Uris.dart__rti, required: true)!;
 
   /// The dart:_internal library.
-  LibraryEntity get internalLibrary => _internalLibrary ??=
-      _env.lookupLibrary(Uris.dart__internal, required: true);
+  late final LibraryEntity internalLibrary =
+      _env.lookupLibrary(Uris.dart__internal, required: true)!;
 
   /// The dart:js library.
-  LibraryEntity get dartJsLibrary =>
-      _dartJsLibrary ??= _env.lookupLibrary(Uris.dart_js);
+  late final LibraryEntity? dartJsLibrary = _env.lookupLibrary(Uris.dart_js);
 
   /// The package:js library.
-  LibraryEntity get packageJsLibrary =>
-      _packageJsLibrary ??= _env.lookupLibrary(Uris.package_js);
+  late final LibraryEntity? packageJsLibrary =
+      _env.lookupLibrary(Uris.package_js);
 
   /// The dart:_js_annotations library.
-  LibraryEntity get dartJsAnnotationsLibrary => _dartJsAnnotationsLibrary ??=
+  late final LibraryEntity? dartJsAnnotationsLibrary =
       _env.lookupLibrary(Uris.dart__js_annotations);
 
   /// The `NativeTypedData` class from dart:typed_data.
   ClassEntity get typedDataClass =>
-      _typedDataClass ??= _findClass(typedDataLibrary, 'NativeTypedData');
+      _findClass(typedDataLibrary, 'NativeTypedData')!;
 
   /// Constructor of the `Symbol` class in dart:internal.
   ///
@@ -299,7 +164,7 @@
       }
       if (_symbolImplementationClass != null) {
         _symbolConstructorTarget =
-            _findConstructor(_symbolImplementationClass, '', required: false);
+            _findConstructor(_symbolImplementationClass!, '', required: false);
       }
     }
     if (_symbolClass == null) {
@@ -317,15 +182,15 @@
   /// Used to check for the constructor without computing it until it is likely
   /// to be seen.
   bool isSymbolConstructor(ConstructorEntity element) {
-    assert(element != null);
+    assert((element as dynamic) != null); // TODO(48820): Remove.
     _ensureSymbolConstructorDependencies();
     return element == _symbolConstructorImplementationTarget ||
         element == _symbolConstructorTarget;
   }
 
   /// The function `identical` in dart:core.
-  FunctionEntity get identicalFunction =>
-      _identicalFunction ??= _findLibraryMember(coreLibrary, 'identical');
+  late final FunctionEntity identicalFunction =
+      _findLibraryMember(coreLibrary, 'identical')!;
 
   /// Whether [element] is the `Function.apply` method.
   ///
@@ -335,47 +200,38 @@
       element.name == 'apply' && element.enclosingClass == functionClass;
 
   /// The `dynamic` type.
-  @override
-  DynamicType get dynamicType => _env.dynamicType;
+  DynamicType get dynamicType => _env.dynamicType as DynamicType;
 
   /// The `Object` type defined in 'dart:core'.
-  @override // CommonElementsForDartTypes
   InterfaceType get objectType => _getRawType(objectClass);
 
   /// The `bool` type defined in 'dart:core'.
-  @override
   InterfaceType get boolType => _getRawType(boolClass);
 
   /// The `num` type defined in 'dart:core'.
   InterfaceType get numType => _getRawType(numClass);
 
   /// The `int` type defined in 'dart:core'.
-  @override // CommonElementsForDartTypes
   InterfaceType get intType => _getRawType(intClass);
 
   /// The `double` type defined in 'dart:core'.
-  @override // CommonElementsForDartTypes
   InterfaceType get doubleType => _getRawType(doubleClass);
 
   /// The `String` type defined in 'dart:core'.
-  @override
   InterfaceType get stringType => _getRawType(stringClass);
 
   /// The `Symbol` type defined in 'dart:core'.
   InterfaceType get symbolType => _getRawType(symbolClass);
 
   /// The `Function` type defined in 'dart:core'.
-  @override // CommonElementsForDartTypes
   InterfaceType get functionType => _getRawType(functionClass);
 
   /// The `Null` type defined in 'dart:core'.
-  @override // CommonElementsForDartTypes
   InterfaceType get nullType => _getRawType(nullClass);
 
   /// The `Type` type defined in 'dart:core'.
   InterfaceType get typeType => _getRawType(typeClass);
 
-  @override
   InterfaceType get typeLiteralType => _getRawType(typeLiteralClass);
 
   /// The `StackTrace` type defined in 'dart:core';
@@ -385,8 +241,7 @@
   /// [elementType] as its type argument.
   ///
   /// If no type argument is provided, the canonical raw type is returned.
-  @override
-  InterfaceType listType([DartType elementType]) {
+  InterfaceType listType([DartType? elementType]) {
     if (elementType == null) {
       return _getRawType(listClass);
     }
@@ -397,7 +252,7 @@
   /// [elementType] as its type argument.
   ///
   /// If no type argument is provided, the canonical raw type is returned.
-  InterfaceType setType([DartType elementType]) {
+  InterfaceType setType([DartType? elementType]) {
     if (elementType == null) {
       return _getRawType(setClass);
     }
@@ -408,8 +263,8 @@
   /// [keyType] and [valueType] as its type arguments.
   ///
   /// If no type arguments are provided, the canonical raw type is returned.
-  @override
-  InterfaceType mapType([DartType keyType, DartType valueType]) {
+
+  InterfaceType mapType([DartType? keyType, DartType? valueType]) {
     if (keyType == null && valueType == null) {
       return _getRawType(mapClass);
     } else if (keyType == null) {
@@ -417,14 +272,14 @@
     } else if (valueType == null) {
       valueType = dynamicType;
     }
-    return _createInterfaceType(mapClass, [keyType, valueType]);
+    return _createInterfaceType(mapClass, [keyType, valueType!]);
   }
 
   /// Returns an instance of the `Iterable` type defined in 'dart:core' with
   /// [elementType] as its type argument.
   ///
   /// If no type argument is provided, the canonical raw type is returned.
-  InterfaceType iterableType([DartType elementType]) {
+  InterfaceType iterableType([DartType? elementType]) {
     if (elementType == null) {
       return _getRawType(iterableClass);
     }
@@ -435,8 +290,8 @@
   /// [elementType] as its type argument.
   ///
   /// If no type argument is provided, the canonical raw type is returned.
-  @override // CommonElementsForDartTypes
-  InterfaceType futureType([DartType elementType]) {
+  // CommonElementsForDartTypes
+  InterfaceType futureType([DartType? elementType]) {
     if (elementType == null) {
       return _getRawType(futureClass);
     }
@@ -447,30 +302,31 @@
   /// [elementType] as its type argument.
   ///
   /// If no type argument is provided, the canonical raw type is returned.
-  InterfaceType streamType([DartType elementType]) {
+  InterfaceType streamType([DartType? elementType]) {
     if (elementType == null) {
       return _getRawType(streamClass);
     }
     return _createInterfaceType(streamClass, [elementType]);
   }
 
-  ClassEntity _findClass(LibraryEntity library, String name,
+  ClassEntity? _findClass(LibraryEntity? library, String name,
       {bool required = true}) {
     if (library == null) return null;
     return _env.lookupClass(library, name, required: required);
   }
 
-  MemberEntity _findLibraryMember(LibraryEntity library, String name,
+  T? _findLibraryMember<T extends MemberEntity>(
+      LibraryEntity? library, String name,
       {bool setter = false, bool required = true}) {
     if (library == null) return null;
     return _env.lookupLibraryMember(library, name,
-        setter: setter, required: required);
+        setter: setter, required: required) as T?;
   }
 
-  MemberEntity _findClassMember(ClassEntity cls, String name,
+  T _findClassMember<T extends MemberEntity>(ClassEntity cls, String name,
       {bool setter = false, bool required = true}) {
     return _env.lookupLocalClassMember(cls, name,
-        setter: setter, required: required);
+        setter: setter, required: required) as T;
   }
 
   ConstructorEntity _findConstructor(ClassEntity cls, String name,
@@ -490,13 +346,11 @@
     return _env.createInterfaceType(cls, typeArguments);
   }
 
-  @override
   InterfaceType getConstantListTypeFor(InterfaceType sourceType) =>
       dartTypes.treatAsRawType(sourceType)
           ? _env.getRawType(jsArrayClass)
           : _env.createInterfaceType(jsArrayClass, sourceType.typeArguments);
 
-  @override
   InterfaceType getConstantMapTypeFor(InterfaceType sourceType,
       {bool onlyStringKeys = false}) {
     ClassEntity classElement =
@@ -508,7 +362,6 @@
     }
   }
 
-  @override
   InterfaceType getConstantSetTypeFor(InterfaceType sourceType) =>
       dartTypes.treatAsRawType(sourceType)
           ? _env.getRawType(constSetLiteralClass)
@@ -517,12 +370,11 @@
 
   /// Returns the field that holds the internal name in the implementation class
   /// for `Symbol`.
-  @override
+
   FieldEntity get symbolField => _symbolImplementationField ??=
       _env.lookupLocalClassMember(symbolImplementationClass, '_name',
-          required: true);
+          required: true) as FieldEntity;
 
-  @override
   InterfaceType get symbolImplementationType =>
       _env.getRawType(symbolImplementationClass);
 
@@ -535,85 +387,37 @@
             _env.lookupLibrary(Uris.dart_collection), 'LinkedHashMap');
       }
     }
-    return _mapLiteralClass;
+    return _mapLiteralClass!;
   }
 
-  void _ensureMapLiteralHelpers() {
-    if (_mapLiteralConstructor != null) return;
+  late final ConstructorEntity mapLiteralConstructor =
+      _env.lookupConstructor(mapLiteralClass, '_literal');
+  late final ConstructorEntity mapLiteralConstructorEmpty =
+      _env.lookupConstructor(mapLiteralClass, '_empty');
+  late final FunctionEntity mapLiteralUntypedMaker =
+      _env.lookupLocalClassMember(mapLiteralClass, '_makeLiteral')
+          as FunctionEntity;
+  late final FunctionEntity mapLiteralUntypedEmptyMaker = _env
+      .lookupLocalClassMember(mapLiteralClass, '_makeEmpty') as FunctionEntity;
 
-    _mapLiteralConstructor =
-        _env.lookupConstructor(mapLiteralClass, '_literal');
-    _mapLiteralConstructorEmpty =
-        _env.lookupConstructor(mapLiteralClass, '_empty');
-    _mapLiteralUntypedMaker =
-        _env.lookupLocalClassMember(mapLiteralClass, '_makeLiteral');
-    _mapLiteralUntypedEmptyMaker =
-        _env.lookupLocalClassMember(mapLiteralClass, '_makeEmpty');
-  }
+  late final ClassEntity setLiteralClass =
+      _findClass(_env.lookupLibrary(Uris.dart_collection), 'LinkedHashSet')!;
 
-  ConstructorEntity get mapLiteralConstructor {
-    _ensureMapLiteralHelpers();
-    return _mapLiteralConstructor;
-  }
+  late final ConstructorEntity setLiteralConstructor =
+      _env.lookupConstructor(setLiteralClass, '_literal');
+  late final ConstructorEntity setLiteralConstructorEmpty =
+      _env.lookupConstructor(setLiteralClass, '_empty');
+  late final FunctionEntity setLiteralUntypedMaker =
+      _env.lookupLocalClassMember(setLiteralClass, '_makeLiteral')
+          as FunctionEntity;
+  late final FunctionEntity setLiteralUntypedEmptyMaker = _env
+      .lookupLocalClassMember(setLiteralClass, '_makeEmpty') as FunctionEntity;
 
-  ConstructorEntity get mapLiteralConstructorEmpty {
-    _ensureMapLiteralHelpers();
-    return _mapLiteralConstructorEmpty;
-  }
-
-  FunctionEntity get mapLiteralUntypedMaker {
-    _ensureMapLiteralHelpers();
-    return _mapLiteralUntypedMaker;
-  }
-
-  FunctionEntity get mapLiteralUntypedEmptyMaker {
-    _ensureMapLiteralHelpers();
-    return _mapLiteralUntypedEmptyMaker;
-  }
-
-  ClassEntity get setLiteralClass => _setLiteralClass ??=
-      _findClass(_env.lookupLibrary(Uris.dart_collection), 'LinkedHashSet');
-
-  void _ensureSetLiteralHelpers() {
-    if (_setLiteralConstructor != null) return;
-
-    _setLiteralConstructor =
-        _env.lookupConstructor(setLiteralClass, '_literal');
-    _setLiteralConstructorEmpty =
-        _env.lookupConstructor(setLiteralClass, '_empty');
-    _setLiteralUntypedMaker =
-        _env.lookupLocalClassMember(setLiteralClass, '_makeLiteral');
-    _setLiteralUntypedEmptyMaker =
-        _env.lookupLocalClassMember(setLiteralClass, '_makeEmpty');
-  }
-
-  ConstructorEntity get setLiteralConstructor {
-    _ensureSetLiteralHelpers();
-    return _setLiteralConstructor;
-  }
-
-  ConstructorEntity get setLiteralConstructorEmpty {
-    _ensureSetLiteralHelpers();
-    return _setLiteralConstructorEmpty;
-  }
-
-  FunctionEntity get setLiteralUntypedMaker {
-    _ensureSetLiteralHelpers();
-    return _setLiteralUntypedMaker;
-  }
-
-  FunctionEntity get setLiteralUntypedEmptyMaker {
-    _ensureSetLiteralHelpers();
-    return _setLiteralUntypedEmptyMaker;
-  }
-
-  FunctionEntity get objectNoSuchMethod {
-    return _objectNoSuchMethod ??=
-        _env.lookupLocalClassMember(objectClass, Identifiers.noSuchMethod_);
-  }
+  late final FunctionEntity objectNoSuchMethod = _env.lookupLocalClassMember(
+      objectClass, Identifiers.noSuchMethod_) as FunctionEntity;
 
   bool isDefaultNoSuchMethodImplementation(FunctionEntity element) {
-    ClassEntity classElement = element.enclosingClass;
+    ClassEntity? classElement = element.enclosingClass;
     return classElement == objectClass ||
         classElement == jsInterceptorClass ||
         classElement == jsNullClass;
@@ -621,10 +425,10 @@
 
   // From dart:async
   ClassEntity _findAsyncHelperClass(String name) =>
-      _findClass(asyncLibrary, name);
+      _findClass(asyncLibrary, name)!;
 
   FunctionEntity _findAsyncHelperFunction(String name) =>
-      _findLibraryMember(asyncLibrary, name);
+      _findLibraryMember(asyncLibrary, name)!;
 
   FunctionEntity get asyncHelperStartSync =>
       _findAsyncHelperFunction("_asyncStartSync");
@@ -642,13 +446,15 @@
       _findAsyncHelperFunction("_wrapJsFunctionForAsync");
 
   FunctionEntity get yieldStar => _env.lookupLocalClassMember(
-      _findAsyncHelperClass("_IterationMarker"), "yieldStar");
+      _findAsyncHelperClass("_IterationMarker"), "yieldStar") as FunctionEntity;
 
   FunctionEntity get yieldSingle => _env.lookupLocalClassMember(
-      _findAsyncHelperClass("_IterationMarker"), "yieldSingle");
+          _findAsyncHelperClass("_IterationMarker"), "yieldSingle")
+      as FunctionEntity;
 
   FunctionEntity get syncStarUncaughtError => _env.lookupLocalClassMember(
-      _findAsyncHelperClass("_IterationMarker"), "uncaughtError");
+          _findAsyncHelperClass("_IterationMarker"), "uncaughtError")
+      as FunctionEntity;
 
   FunctionEntity get asyncStarHelper =>
       _findAsyncHelperFunction("_asyncStarHelper");
@@ -657,7 +463,8 @@
       _findAsyncHelperFunction("_streamOfController");
 
   FunctionEntity get endOfIteration => _env.lookupLocalClassMember(
-      _findAsyncHelperClass("_IterationMarker"), "endOfIteration");
+          _findAsyncHelperClass("_IterationMarker"), "endOfIteration")
+      as FunctionEntity;
 
   ClassEntity get syncStarIterable =>
       _findAsyncHelperClass("_SyncStarIterable");
@@ -672,95 +479,82 @@
   ConstructorEntity get streamIteratorConstructor =>
       _env.lookupConstructor(streamIterator, "");
 
-  FunctionEntity get syncStarIterableFactory => _syncStarIterableFactory ??=
+  late final FunctionEntity syncStarIterableFactory =
       _findAsyncHelperFunction('_makeSyncStarIterable');
 
-  FunctionEntity get asyncAwaitCompleterFactory =>
-      _asyncAwaitCompleterFactory ??=
-          _findAsyncHelperFunction('_makeAsyncAwaitCompleter');
+  late final FunctionEntity asyncAwaitCompleterFactory =
+      _findAsyncHelperFunction('_makeAsyncAwaitCompleter');
 
-  FunctionEntity get asyncStarStreamControllerFactory =>
-      _asyncStarStreamControllerFactory ??=
-          _findAsyncHelperFunction('_makeAsyncStarStreamController');
+  late final FunctionEntity asyncStarStreamControllerFactory =
+      _findAsyncHelperFunction('_makeAsyncStarStreamController');
 
   // From dart:_interceptors
   ClassEntity _findInterceptorsClass(String name) =>
-      _findClass(interceptorsLibrary, name);
+      _findClass(interceptorsLibrary, name)!;
 
   FunctionEntity _findInterceptorsFunction(String name) =>
-      _findLibraryMember(interceptorsLibrary, name);
+      _findLibraryMember(interceptorsLibrary, name)!;
 
-  ClassEntity get jsInterceptorClass =>
-      _jsInterceptorClass ??= _findInterceptorsClass('Interceptor');
+  late final ClassEntity jsInterceptorClass =
+      _findInterceptorsClass('Interceptor');
 
-  ClassEntity get jsStringClass =>
-      _jsStringClass ??= _findInterceptorsClass('JSString');
+  late final ClassEntity jsStringClass = _findInterceptorsClass('JSString');
 
-  ClassEntity get jsArrayClass =>
-      _jsArrayClass ??= _findInterceptorsClass('JSArray');
+  late final ClassEntity jsArrayClass = _findInterceptorsClass('JSArray');
 
-  ClassEntity get jsNumberClass =>
-      _jsNumberClass ??= _findInterceptorsClass('JSNumber');
+  late final ClassEntity jsNumberClass = _findInterceptorsClass('JSNumber');
 
-  ClassEntity get jsIntClass => _jsIntClass ??= _findInterceptorsClass('JSInt');
+  late final ClassEntity jsIntClass = _findInterceptorsClass('JSInt');
 
-  ClassEntity get jsNumNotIntClass =>
-      _jsNumNotIntClass ??= _findInterceptorsClass('JSNumNotInt');
+  late final ClassEntity jsNumNotIntClass =
+      _findInterceptorsClass('JSNumNotInt');
 
-  ClassEntity get jsNullClass =>
-      _jsNullClass ??= _findInterceptorsClass('JSNull');
+  late final ClassEntity jsNullClass = _findInterceptorsClass('JSNull');
 
-  ClassEntity get jsBoolClass =>
-      _jsBoolClass ??= _findInterceptorsClass('JSBool');
+  late final ClassEntity jsBoolClass = _findInterceptorsClass('JSBool');
 
-  ClassEntity get jsPlainJavaScriptObjectClass =>
-      _jsPlainJavaScriptObjectClass ??=
-          _findInterceptorsClass('PlainJavaScriptObject');
+  late final ClassEntity jsPlainJavaScriptObjectClass =
+      _findInterceptorsClass('PlainJavaScriptObject');
 
-  ClassEntity get jsUnknownJavaScriptObjectClass =>
-      _jsUnknownJavaScriptObjectClass ??=
-          _findInterceptorsClass('UnknownJavaScriptObject');
+  late final ClassEntity jsUnknownJavaScriptObjectClass =
+      _findInterceptorsClass('UnknownJavaScriptObject');
 
-  ClassEntity get jsJavaScriptFunctionClass => _jsJavaScriptFunctionClass ??=
+  late final ClassEntity jsJavaScriptFunctionClass =
       _findInterceptorsClass('JavaScriptFunction');
 
-  @override // CommonElementsForDartTypes
   InterfaceType get jsJavaScriptFunctionType =>
       _getRawType(jsJavaScriptFunctionClass);
 
-  ClassEntity get jsLegacyJavaScriptObjectClass =>
-      _jsLegacyJavaScriptObjectClass ??=
-          _findInterceptorsClass('LegacyJavaScriptObject');
+  late final ClassEntity jsLegacyJavaScriptObjectClass =
+      _findInterceptorsClass('LegacyJavaScriptObject');
 
-  ClassEntity get jsJavaScriptObjectClass =>
-      _jsJavaScriptObjectClass ??= _findInterceptorsClass('JavaScriptObject');
+  late final ClassEntity jsJavaScriptObjectClass =
+      _findInterceptorsClass('JavaScriptObject');
 
-  ClassEntity get jsIndexableClass =>
-      _jsIndexableClass ??= _findInterceptorsClass('JSIndexable');
+  late final ClassEntity jsIndexableClass =
+      _findInterceptorsClass('JSIndexable');
 
-  ClassEntity get jsMutableIndexableClass =>
-      _jsMutableIndexableClass ??= _findInterceptorsClass('JSMutableIndexable');
+  late final ClassEntity jsMutableIndexableClass =
+      _findInterceptorsClass('JSMutableIndexable');
 
-  ClassEntity get jsMutableArrayClass =>
-      _jsMutableArrayClass ??= _findInterceptorsClass('JSMutableArray');
+  late final ClassEntity jsMutableArrayClass =
+      _findInterceptorsClass('JSMutableArray');
 
-  ClassEntity get jsFixedArrayClass =>
-      _jsFixedArrayClass ??= _findInterceptorsClass('JSFixedArray');
+  late final ClassEntity jsFixedArrayClass =
+      _findInterceptorsClass('JSFixedArray');
 
-  ClassEntity get jsExtendableArrayClass =>
-      _jsExtendableArrayClass ??= _findInterceptorsClass('JSExtendableArray');
+  late final ClassEntity jsExtendableArrayClass =
+      _findInterceptorsClass('JSExtendableArray');
 
-  ClassEntity get jsUnmodifiableArrayClass => _jsUnmodifiableArrayClass ??=
+  late final ClassEntity jsUnmodifiableArrayClass =
       _findInterceptorsClass('JSUnmodifiableArray');
 
-  ClassEntity get jsPositiveIntClass =>
-      _jsPositiveIntClass ??= _findInterceptorsClass('JSPositiveInt');
+  late final ClassEntity jsPositiveIntClass =
+      _findInterceptorsClass('JSPositiveInt');
 
-  ClassEntity get jsUInt32Class =>
-      _jsUInt32Class ??= _findInterceptorsClass('JSUInt32');
+  late final ClassEntity jsUInt32Class = _findInterceptorsClass('JSUInt32');
 
-  ClassEntity get jsUInt31Class =>
-      _jsUInt31Class ??= _findInterceptorsClass('JSUInt31');
+  late final ClassEntity jsUInt31Class = _findInterceptorsClass('JSUInt31');
 
   /// Returns `true` member is the 'findIndexForNativeSubclassType' method
   /// declared in `dart:_interceptors`.
@@ -770,112 +564,95 @@
         member.library == interceptorsLibrary;
   }
 
-  FunctionEntity get getNativeInterceptorMethod =>
-      _getNativeInterceptorMethod ??=
-          _findInterceptorsFunction('getNativeInterceptor');
+  late final FunctionEntity getNativeInterceptorMethod =
+      _findInterceptorsFunction('getNativeInterceptor');
 
-  ConstructorEntity get jsArrayTypedConstructor =>
-      _jsArrayTypedConstructor ??= _findConstructor(jsArrayClass, 'typed');
+  late final ConstructorEntity jsArrayTypedConstructor =
+      _findConstructor(jsArrayClass, 'typed');
 
   // From dart:_js_helper
   // TODO(johnniwinther): Avoid the need for this (from [CheckedModeHelper]).
   FunctionEntity findHelperFunction(String name) => _findHelperFunction(name);
 
   FunctionEntity _findHelperFunction(String name) =>
-      _findLibraryMember(jsHelperLibrary, name);
+      _findLibraryMember(jsHelperLibrary, name)!;
 
   ClassEntity _findHelperClass(String name) =>
-      _findClass(jsHelperLibrary, name);
+      _findClass(jsHelperLibrary, name)!;
 
   FunctionEntity _findLateHelperFunction(String name) =>
-      _findLibraryMember(lateHelperLibrary, name);
+      _findLibraryMember(lateHelperLibrary, name)!;
 
-  ClassEntity get closureClass => _closureClass ??= _findHelperClass('Closure');
+  late final ClassEntity closureClass = _findHelperClass('Closure');
 
-  ClassEntity get closureClass0Args =>
-      _closureClass0Args ??= _findHelperClass('Closure0Args');
+  late final ClassEntity closureClass0Args = _findHelperClass('Closure0Args');
 
-  ClassEntity get closureClass2Args =>
-      _closureClass2Args ??= _findHelperClass('Closure2Args');
+  late final ClassEntity closureClass2Args = _findHelperClass('Closure2Args');
 
-  ClassEntity get boundClosureClass =>
-      _boundClosureClass ??= _findHelperClass('BoundClosure');
+  late final ClassEntity boundClosureClass = _findHelperClass('BoundClosure');
 
-  ClassEntity get typeLiteralClass =>
-      _typeLiteralClass ??= _findRtiClass('_Type');
+  late final ClassEntity typeLiteralClass = _findRtiClass('_Type');
 
-  ClassEntity get constMapLiteralClass =>
-      _constMapLiteralClass ??= _findHelperClass('ConstantMap');
+  late final ClassEntity constMapLiteralClass = _findHelperClass('ConstantMap');
 
   // TODO(fishythefish): Implement a `ConstantSet` class and update the backend
   // impacts + constant emitter accordingly.
-  ClassEntity get constSetLiteralClass =>
-      _constSetLiteralClass ??= unmodifiableSetClass;
+  late final ClassEntity constSetLiteralClass = unmodifiableSetClass;
 
-  ClassEntity get jsInvocationMirrorClass =>
-      _jsInvocationMirrorClass ??= _findHelperClass('JSInvocationMirror');
+  late final ClassEntity jsInvocationMirrorClass =
+      _findHelperClass('JSInvocationMirror');
 
-  ClassEntity get requiredSentinelClass =>
-      _requiredSentinelClass ??= _findHelperClass('_Required');
+  late final ClassEntity requiredSentinelClass = _findHelperClass('_Required');
 
   InterfaceType get requiredSentinelType => _getRawType(requiredSentinelClass);
 
-  MemberEntity get invocationTypeArgumentGetter =>
-      _invocationTypeArgumentGetter ??=
-          _findClassMember(jsInvocationMirrorClass, 'typeArguments');
+  late final MemberEntity invocationTypeArgumentGetter =
+      _findClassMember(jsInvocationMirrorClass, 'typeArguments');
 
   /// Interface used to determine if an object has the JavaScript
   /// indexing behavior. The interface is only visible to specific libraries.
-  ClassEntity get jsIndexingBehaviorInterface =>
-      _jsIndexingBehaviorInterface ??=
-          _findHelperClass('JavaScriptIndexingBehavior');
+  late final ClassEntity jsIndexingBehaviorInterface =
+      _findHelperClass('JavaScriptIndexingBehavior');
 
-  ClassEntity get stackTraceHelperClass => _findHelperClass('_StackTrace');
+  late final ClassEntity stackTraceHelperClass =
+      _findHelperClass('_StackTrace');
 
-  ClassEntity get constantMapClass =>
+  late final ClassEntity constantMapClass =
       _findHelperClass(constant_system.JavaScriptMapConstant.DART_CLASS);
 
-  ClassEntity get constantStringMapClass =>
+  late final ClassEntity constantStringMapClass =
       _findHelperClass(constant_system.JavaScriptMapConstant.DART_STRING_CLASS);
 
-  ClassEntity get generalConstantMapClass => _findHelperClass(
+  late final ClassEntity generalConstantMapClass = _findHelperClass(
       constant_system.JavaScriptMapConstant.DART_GENERAL_CLASS);
 
-  ClassEntity get annotationCreatesClass => _findHelperClass('Creates');
+  late final ClassEntity annotationCreatesClass = _findHelperClass('Creates');
 
-  ClassEntity get annotationReturnsClass => _findHelperClass('Returns');
+  late final ClassEntity annotationReturnsClass = _findHelperClass('Returns');
 
-  ClassEntity get annotationJSNameClass => _findHelperClass('JSName');
+  late final ClassEntity annotationJSNameClass = _findHelperClass('JSName');
 
   /// The class for native annotations defined in dart:_js_helper.
-  ClassEntity get nativeAnnotationClass =>
-      _nativeAnnotationClass ??= _findHelperClass('Native');
+  late final ClassEntity nativeAnnotationClass = _findHelperClass('Native');
 
-  FunctionEntity get assertTest =>
-      _assertTest ??= _findHelperFunction('assertTest');
+  late final assertTest = _findHelperFunction('assertTest');
 
-  FunctionEntity get assertThrow =>
-      _assertThrow ??= _findHelperFunction('assertThrow');
+  late final assertThrow = _findHelperFunction('assertThrow');
 
-  FunctionEntity get assertHelper =>
-      _assertHelper ??= _findHelperFunction('assertHelper');
+  late final assertHelper = _findHelperFunction('assertHelper');
 
-  FunctionEntity get assertUnreachableMethod =>
-      _assertUnreachableMethod ??= _findHelperFunction('assertUnreachable');
+  late final assertUnreachableMethod = _findHelperFunction('assertUnreachable');
 
   /// Holds the method "getIsolateAffinityTag" when dart:_js_helper has been
   /// loaded.
-  FunctionEntity get getIsolateAffinityTagMarker =>
-      _getIsolateAffinityTagMarker ??=
-          _findHelperFunction('getIsolateAffinityTag');
+  late final getIsolateAffinityTagMarker =
+      _findHelperFunction('getIsolateAffinityTag');
 
   /// Holds the method "requiresPreamble" in _js_helper.
-  FunctionEntity get requiresPreambleMarker =>
-      _requiresPreambleMarker ??= _findHelperFunction('requiresPreamble');
+  late final requiresPreambleMarker = _findHelperFunction('requiresPreamble');
 
   /// Holds the method "_rawStartupMetrics" in _js_helper.
-  FunctionEntity get rawStartupMetrics =>
-      _rawStartupMetrics ??= _findHelperFunction('rawStartupMetrics');
+  late final rawStartupMetrics = _findHelperFunction('rawStartupMetrics');
 
   FunctionEntity get loadDeferredLibrary =>
       _findHelperFunction("loadDeferredLibrary");
@@ -913,9 +690,8 @@
         member.library == jsHelperLibrary;
   }
 
-  FunctionEntity get checkConcurrentModificationError =>
-      _cachedCheckConcurrentModificationError ??=
-          _findHelperFunction('checkConcurrentModificationError');
+  late final FunctionEntity checkConcurrentModificationError =
+      _findHelperFunction('checkConcurrentModificationError');
 
   FunctionEntity get throwConcurrentModificationError =>
       _findHelperFunction('throwConcurrentModificationError');
@@ -999,62 +775,57 @@
 
   // From dart:_rti
 
-  ClassEntity _findRtiClass(String name) => _findClass(rtiLibrary, name);
+  ClassEntity _findRtiClass(String name) => _findClass(rtiLibrary, name)!;
 
   FunctionEntity _findRtiFunction(String name) =>
-      _findLibraryMember(rtiLibrary, name);
+      _findLibraryMember(rtiLibrary, name)!;
 
-  FunctionEntity get setArrayType =>
-      _setArrayType ??= _findRtiFunction('_setArrayType');
+  late final FunctionEntity setArrayType = _findRtiFunction('_setArrayType');
 
-  FunctionEntity get findType => _findType ??= _findRtiFunction('findType');
+  late final FunctionEntity findType = _findRtiFunction('findType');
 
-  FunctionEntity get instanceType =>
-      _instanceType ??= _findRtiFunction('instanceType');
+  late final FunctionEntity instanceType = _findRtiFunction('instanceType');
 
-  FunctionEntity get arrayInstanceType =>
-      _arrayInstanceType ??= _findRtiFunction('_arrayInstanceType');
+  late final FunctionEntity arrayInstanceType =
+      _findRtiFunction('_arrayInstanceType');
 
-  FunctionEntity get simpleInstanceType =>
-      _simpleInstanceType ??= _findRtiFunction('_instanceType');
+  late final FunctionEntity simpleInstanceType =
+      _findRtiFunction('_instanceType');
 
-  FunctionEntity get typeLiteralMaker =>
-      _typeLiteralMaker ??= _findRtiFunction('typeLiteral');
+  late final FunctionEntity typeLiteralMaker = _findRtiFunction('typeLiteral');
 
-  FunctionEntity get checkTypeBound =>
-      _checkTypeBound ??= _findRtiFunction('checkTypeBound');
+  late final FunctionEntity checkTypeBound = _findRtiFunction('checkTypeBound');
 
-  ClassEntity get _rtiImplClass => _findClass(rtiLibrary, 'Rti');
+  ClassEntity get _rtiImplClass => _findClass(rtiLibrary, 'Rti')!;
 
-  ClassEntity get _rtiUniverseClass => _findClass(rtiLibrary, '_Universe');
+  ClassEntity get _rtiUniverseClass => _findClass(rtiLibrary, '_Universe')!;
 
   FieldEntity _findRtiClassField(String name) =>
       _findClassMember(_rtiImplClass, name);
 
-  FieldEntity get rtiAsField => _rtiAsField ??= _findRtiClassField('_as');
+  late final FieldEntity rtiAsField = _findRtiClassField('_as');
 
-  FieldEntity get rtiIsField => _rtiIsField ??= _findRtiClassField('_is');
+  late final FieldEntity rtiIsField = _findRtiClassField('_is');
 
-  FieldEntity get rtiRestField => _rtiRestField ??= _findRtiClassField('_rest');
+  late final FieldEntity rtiRestField = _findRtiClassField('_rest');
 
-  FieldEntity get rtiPrecomputed1Field =>
-      _rtiPrecomputed1Field ??= _findRtiClassField('_precomputed1');
+  late final FieldEntity rtiPrecomputed1Field =
+      _findRtiClassField('_precomputed1');
 
-  FunctionEntity get rtiEvalMethod =>
-      _rtiEvalMethod ??= _findClassMember(_rtiImplClass, '_eval');
+  late final FunctionEntity rtiEvalMethod =
+      _findClassMember(_rtiImplClass, '_eval');
 
-  FunctionEntity get rtiBindMethod =>
-      _rtiBindMethod ??= _findClassMember(_rtiImplClass, '_bind');
+  late final FunctionEntity rtiBindMethod =
+      _findClassMember(_rtiImplClass, '_bind');
 
-  FunctionEntity get rtiAddRulesMethod =>
-      _rtiAddRulesMethod ??= _findClassMember(_rtiUniverseClass, 'addRules');
+  late final FunctionEntity rtiAddRulesMethod =
+      _findClassMember(_rtiUniverseClass, 'addRules');
 
-  FunctionEntity get rtiAddErasedTypesMethod => _rtiAddErasedTypesMethod ??=
+  late final FunctionEntity rtiAddErasedTypesMethod =
       _findClassMember(_rtiUniverseClass, 'addErasedTypes');
 
-  FunctionEntity get rtiAddTypeParameterVariancesMethod =>
-      _rtiAddTypeParameterVariancesMethod ??=
-          _findClassMember(_rtiUniverseClass, 'addTypeParameterVariances');
+  late final FunctionEntity rtiAddTypeParameterVariancesMethod =
+      _findClassMember(_rtiUniverseClass, 'addTypeParameterVariances');
 
   FunctionEntity get installSpecializedIsTest =>
       _findRtiFunction('_installSpecializedIsTest');
@@ -1062,27 +833,21 @@
   FunctionEntity get installSpecializedAsCheck =>
       _findRtiFunction('_installSpecializedAsCheck');
 
-  FunctionEntity get generalIsTestImplementation =>
-      _generalIsTestImplementation ??=
-          _findRtiFunction('_generalIsTestImplementation');
+  late final FunctionEntity generalIsTestImplementation =
+      _findRtiFunction('_generalIsTestImplementation');
 
-  FunctionEntity get generalNullableIsTestImplementation =>
-      _generalNullableIsTestImplementation ??=
-          _findRtiFunction('_generalNullableIsTestImplementation');
+  late final FunctionEntity generalNullableIsTestImplementation =
+      _findRtiFunction('_generalNullableIsTestImplementation');
 
-  FunctionEntity get generalAsCheckImplementation =>
-      _generalAsCheckImplementation ??=
-          _findRtiFunction('_generalAsCheckImplementation');
+  late final FunctionEntity generalAsCheckImplementation =
+      _findRtiFunction('_generalAsCheckImplementation');
 
-  FunctionEntity get generalNullableAsCheckImplementation =>
-      _generalNullableAsCheckImplementation ??=
-          _findRtiFunction('_generalNullableAsCheckImplementation');
+  late final FunctionEntity generalNullableAsCheckImplementation =
+      _findRtiFunction('_generalNullableAsCheckImplementation');
 
-  FunctionEntity get specializedIsObject =>
-      _specializedIsObject ??= _findRtiFunction('_isObject');
+  late final FunctionEntity specializedIsObject = _findRtiFunction('_isObject');
 
-  FunctionEntity get specializedAsObject =>
-      _specializedAsObject ??= _findRtiFunction('_asObject');
+  late final FunctionEntity specializedAsObject = _findRtiFunction('_asObject');
 
   FunctionEntity get specializedIsTop => _findRtiFunction('_isTop');
 
@@ -1138,20 +903,20 @@
 
   // From dart:_internal
 
-  ClassEntity get symbolImplementationClass =>
-      _symbolImplementationClass ??= _findClass(internalLibrary, 'Symbol');
+  late final ClassEntity symbolImplementationClass =
+      _findClass(internalLibrary, 'Symbol')!;
 
   /// Used to annotate items that have the keyword "native".
-  ClassEntity get externalNameClass =>
-      _externalNameClass ??= _findClass(internalLibrary, 'ExternalName');
+  late final ClassEntity externalNameClass =
+      _findClass(internalLibrary, 'ExternalName')!;
 
   InterfaceType get externalNameType => _getRawType(externalNameClass);
 
   // From dart:_js_embedded_names
 
-  ClassEntity get jsGetNameEnum => _jsGetNameEnum ??= _findClass(
+  late final ClassEntity jsGetNameEnum = _findClass(
       _env.lookupLibrary(Uris.dart__js_embedded_names, required: true),
-      'JsGetName');
+      'JsGetName')!;
 
   /// Returns `true` if [member] is a "foreign helper", that is, a member whose
   /// semantics is defined synthetically and not through Dart code.
@@ -1222,11 +987,11 @@
   }
 
   // From package:js
-  FunctionEntity get jsAllowInterop1 => _jsAllowInterop1 ??=
+  late final FunctionEntity? jsAllowInterop1 =
       _findLibraryMember(dartJsLibrary, 'allowInterop', required: false);
 
   // From dart:_js_annotations;
-  FunctionEntity get jsAllowInterop2 => _jsAllowInterop2 ??= _findLibraryMember(
+  late final FunctionEntity? jsAllowInterop2 = _findLibraryMember(
       dartJsAnnotationsLibrary, 'allowInterop',
       required: false);
 
@@ -1245,31 +1010,23 @@
 }
 
 class KCommonElements extends CommonElements {
-  ClassEntity _jsAnnotationClass1;
-  ClassEntity _jsAnonymousClass1;
-  ClassEntity _jsAnnotationClass2;
-  ClassEntity _jsAnonymousClass2;
-  ClassEntity _pragmaClass;
-  FieldEntity _pragmaClassNameField;
-  FieldEntity _pragmaClassOptionsField;
-
   KCommonElements(DartTypes dartTypes, ElementEnvironment env)
       : super(dartTypes, env);
 
   // From package:js
 
-  ClassEntity get jsAnnotationClass1 => _jsAnnotationClass1 ??=
+  late final ClassEntity? jsAnnotationClass1 =
       _findClass(packageJsLibrary, 'JS', required: false);
 
-  ClassEntity get jsAnonymousClass1 => _jsAnonymousClass1 ??=
+  late final ClassEntity? jsAnonymousClass1 =
       _findClass(packageJsLibrary, '_Anonymous', required: false);
 
   // From dart:_js_annotations
 
-  ClassEntity get jsAnnotationClass2 => _jsAnnotationClass2 ??=
+  late final ClassEntity? jsAnnotationClass2 =
       _findClass(dartJsAnnotationsLibrary, 'JS', required: false);
 
-  ClassEntity get jsAnonymousClass2 => _jsAnonymousClass2 ??=
+  late final ClassEntity? jsAnonymousClass2 =
       _findClass(dartJsAnnotationsLibrary, '_Anonymous', required: false);
 
   /// Returns `true` if [cls] is a @JS() annotation.
@@ -1286,26 +1043,17 @@
     return cls == jsAnonymousClass1 || cls == jsAnonymousClass2;
   }
 
-  ClassEntity get pragmaClass =>
-      _pragmaClass ??= _findClass(coreLibrary, 'pragma');
+  late final ClassEntity pragmaClass = _findClass(coreLibrary, 'pragma')!;
 
-  FieldEntity get pragmaClassNameField =>
-      _pragmaClassNameField ??= _findClassMember(pragmaClass, 'name');
+  late final FieldEntity pragmaClassNameField =
+      _findClassMember(pragmaClass, 'name');
 
-  FieldEntity get pragmaClassOptionsField =>
-      _pragmaClassOptionsField ??= _findClassMember(pragmaClass, 'options');
+  late final FieldEntity pragmaClassOptionsField =
+      _findClassMember(pragmaClass, 'options');
 }
 
 class JCommonElements extends CommonElements {
-  FunctionEntity _jsArrayRemoveLast;
-  FunctionEntity _jsArrayAdd;
-  FunctionEntity _jsStringSplit;
-  FunctionEntity _jsStringToString;
-  FunctionEntity _jsStringOperatorAdd;
-  ClassEntity _jsConstClass;
-  ClassEntity _typedArrayOfIntClass;
-  ClassEntity _typedArrayOfDoubleClass;
-  ClassEntity _jsBuiltinEnum;
+  FunctionEntity? _jsStringSplit;
 
   JCommonElements(DartTypes dartTypes, ElementEnvironment env)
       : super(dartTypes, env);
@@ -1336,7 +1084,7 @@
 
   bool isDefaultEqualityImplementation(MemberEntity element) {
     assert(element.name == '==');
-    ClassEntity classElement = element.enclosingClass;
+    ClassEntity? classElement = element.enclosingClass;
     return classElement == objectClass ||
         classElement == jsInterceptorClass ||
         classElement == jsNullClass;
@@ -1347,11 +1095,10 @@
     return selector.name == 'length' && (selector.isGetter || selector.isCall);
   }
 
-  FunctionEntity get jsArrayRemoveLast =>
-      _jsArrayRemoveLast ??= _findClassMember(jsArrayClass, 'removeLast');
+  late final FunctionEntity jsArrayRemoveLast =
+      _findClassMember(jsArrayClass, 'removeLast');
 
-  FunctionEntity get jsArrayAdd =>
-      _jsArrayAdd ??= _findClassMember(jsArrayClass, 'add');
+  late final FunctionEntity jsArrayAdd = _findClassMember(jsArrayClass, 'add');
 
   bool _isJsStringClass(ClassEntity cls) {
     return cls.name == 'JSString' && cls.library == interceptorsLibrary;
@@ -1360,23 +1107,23 @@
   bool isJsStringSplit(MemberEntity member) {
     return member.name == 'split' &&
         member.isInstanceMember &&
-        _isJsStringClass(member.enclosingClass);
+        _isJsStringClass(member.enclosingClass!);
   }
 
   /// Returns `true` if [selector] applies to `JSString.split` on [receiver]
   /// in the given [world].
   ///
   /// Returns `false` if `JSString.split` is not available.
-  bool appliesToJsStringSplit(Selector selector, AbstractValue receiver,
+  bool appliesToJsStringSplit(Selector selector, AbstractValue? receiver,
       AbstractValueDomain abstractValueDomain) {
     if (_jsStringSplit == null) {
-      ClassEntity cls =
+      ClassEntity? cls =
           _findClass(interceptorsLibrary, 'JSString', required: false);
       if (cls == null) return false;
       _jsStringSplit = _findClassMember(cls, 'split', required: false);
       if (_jsStringSplit == null) return false;
     }
-    return selector.applies(_jsStringSplit) &&
+    return selector.applies(_jsStringSplit!) &&
         (receiver == null ||
             abstractValueDomain
                 .isTargetingMember(receiver, jsStringSplit, selector.memberName)
@@ -1386,14 +1133,13 @@
   FunctionEntity get jsStringSplit =>
       _jsStringSplit ??= _findClassMember(jsStringClass, 'split');
 
-  FunctionEntity get jsStringToString =>
-      _jsStringToString ??= _findClassMember(jsStringClass, 'toString');
+  late final FunctionEntity jsStringToString =
+      _findClassMember(jsStringClass, 'toString');
 
-  FunctionEntity get jsStringOperatorAdd =>
-      _jsStringOperatorAdd ??= _findClassMember(jsStringClass, '+');
+  late final FunctionEntity jsStringOperatorAdd =
+      _findClassMember(jsStringClass, '+');
 
-  ClassEntity get jsConstClass =>
-      _jsConstClass ??= _findClass(foreignLibrary, 'JS_CONST');
+  late final ClassEntity jsConstClass = _findClass(foreignLibrary, 'JS_CONST')!;
 
   /// Return `true` if [member] is the 'checkInt' function defined in
   /// dart:_js_helpers.
@@ -1423,25 +1169,24 @@
   }
 
   bool isInstantiationClass(ClassEntity cls) {
-    return cls.library == _jsHelperLibrary &&
+    return cls.library == jsHelperLibrary &&
         cls.name != 'Instantiation' &&
         cls.name.startsWith('Instantiation');
   }
 
   // From dart:_native_typed_data
 
-  ClassEntity get typedArrayOfIntClass => _typedArrayOfIntClass ??= _findClass(
+  late final ClassEntity? typedArrayOfIntClass = _findClass(
       _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
       'NativeTypedArrayOfInt');
 
-  ClassEntity get typedArrayOfDoubleClass =>
-      _typedArrayOfDoubleClass ??= _findClass(
-          _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
-          'NativeTypedArrayOfDouble');
+  late final ClassEntity typedArrayOfDoubleClass = _findClass(
+      _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
+      'NativeTypedArrayOfDouble')!;
 
-  ClassEntity get jsBuiltinEnum => _jsBuiltinEnum ??= _findClass(
+  late final ClassEntity jsBuiltinEnum = _findClass(
       _env.lookupLibrary(Uris.dart__js_embedded_names, required: true),
-      'JsBuiltin');
+      'JsBuiltin')!;
 
   bool isForeign(MemberEntity element) => element.library == foreignLibrary;
 
@@ -1450,7 +1195,7 @@
   bool operatorEqHandlesNullArgument(FunctionEntity function) {
     assert(function.name == '==',
         failedAt(function, "Unexpected function $function."));
-    ClassEntity cls = function.enclosingClass;
+    ClassEntity? cls = function.enclosingClass;
     return cls == objectClass ||
         cls == jsInterceptorClass ||
         cls == jsNullClass;
@@ -1482,14 +1227,14 @@
 
   /// Lookup the library with the canonical [uri], fail if the library is
   /// missing and [required];
-  LibraryEntity lookupLibrary(Uri uri, {bool required = false});
+  LibraryEntity? lookupLibrary(Uri uri, {bool required = false});
 
   /// Calls [f] for every class declared in [library].
   void forEachClass(LibraryEntity library, void f(ClassEntity cls));
 
   /// Lookup the class [name] in [library], fail if the class is missing and
   /// [required].
-  ClassEntity lookupClass(LibraryEntity library, String name,
+  ClassEntity? lookupClass(LibraryEntity library, String name,
       {bool required = false});
 
   /// Calls [f] for every top level member in [library].
@@ -1497,26 +1242,27 @@
 
   /// Lookup the member [name] in [library], fail if the class is missing and
   /// [required].
-  MemberEntity lookupLibraryMember(LibraryEntity library, String name,
+  MemberEntity? lookupLibraryMember(LibraryEntity library, String name,
       {bool setter = false, bool required = false});
 
   /// Lookup the member [name] in [cls], fail if the class is missing and
   /// [required].
-  MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
+  MemberEntity? lookupLocalClassMember(ClassEntity cls, String name,
       {bool setter = false, bool required = false});
 
   /// Lookup the member [name] in [cls] and its superclasses.
   ///
   /// Return `null` if the member is not found in the class or any superclass.
-  MemberEntity lookupClassMember(ClassEntity cls, String name,
+  MemberEntity? lookupClassMember(ClassEntity cls, String name,
       {bool setter = false}) {
-    while (true) {
-      final entity = lookupLocalClassMember(cls, name, setter: setter);
+    ClassEntity? clsLocal = cls;
+    while (clsLocal != null) {
+      final entity = lookupLocalClassMember(clsLocal, name, setter: setter);
       if (entity != null) return entity;
 
-      cls = getSuperClass(cls);
-      if (cls == null) return null;
+      clsLocal = getSuperClass(clsLocal);
     }
+    return null;
   }
 
   /// Lookup the constructor [name] in [cls], fail if the class is missing and
@@ -1555,7 +1301,7 @@
   /// typically named `S+M` and `getSuperClass(S+M)` is `S`, whereas
   /// the result of `getSuperClass(C, skipUnnamedMixinApplications: false)` is
   /// `S`.
-  ClassEntity getSuperClass(ClassEntity cls,
+  ClassEntity? getSuperClass(ClassEntity cls,
       {bool skipUnnamedMixinApplications = false});
 
   /// Calls [f] for each supertype of [cls].
@@ -1580,7 +1326,7 @@
 
   /// Returns the 'raw type' of [cls]. That is, the instantiation of [cls]
   /// where all types arguments are `dynamic`.
-  InterfaceType /*!*/ getRawType(ClassEntity /*!*/ cls);
+  InterfaceType getRawType(ClassEntity cls);
 
   /// Returns the 'JS-interop type' of [cls]; that is, the instantiation of
   /// [cls] where all type arguments are 'any'.
@@ -1591,7 +1337,7 @@
   InterfaceType getThisType(ClassEntity cls);
 
   /// Returns the instantiation of [cls] to bounds.
-  InterfaceType /*!*/ getClassInstantiationToBounds(ClassEntity cls);
+  InterfaceType getClassInstantiationToBounds(ClassEntity cls);
 
   /// Returns `true` if [cls] is generic.
   bool isGenericClass(ClassEntity cls);
@@ -1712,6 +1458,6 @@
       void f(DartType type, String name, ConstantValue defaultValue));
 
   /// Calls [f] for each parameter - given as a [Local] - of [function].
-  void forEachParameterAsLocal(GlobalLocalsMap globalLocalsMap,
+  void forEachParameterAsLocal(covariant GlobalLocalsMap globalLocalsMap,
       FunctionEntity function, void f(Local parameter));
 }
diff --git a/pkg/compiler/lib/src/constants/common_elements_for_constants.dart b/pkg/compiler/lib/src/constants/common_elements_for_constants.dart
deleted file mode 100644
index 7aee2af..0000000
--- a/pkg/compiler/lib/src/constants/common_elements_for_constants.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2022, 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 '../elements/entities.dart';
-import '../elements/types.dart';
-
-/// This is a facade interface for the members of CommonElements that are
-/// required by 'constants/value.dart'.
-// TODO(48820): When CommonElements is migrated, remove this facade.
-abstract class CommonElements {
-  DartType get boolType;
-  DartType get doubleType;
-  DartType get dynamicType;
-  DartType get intType;
-  DartType get nullType;
-  DartType get stringType;
-
-  DartTypes get dartTypes;
-
-  InterfaceType getConstantListTypeFor(InterfaceType sourceType);
-  InterfaceType getConstantMapTypeFor(InterfaceType sourceType,
-      {bool onlyStringKeys = false});
-  InterfaceType getConstantSetTypeFor(InterfaceType sourceType);
-  InterfaceType listType([DartType? elementType]);
-  InterfaceType mapType([DartType? keyType, DartType? valueType]);
-  InterfaceType get symbolImplementationType;
-  InterfaceType get typeLiteralType;
-
-  FieldEntity get symbolField;
-}
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 81daa78..3a8841c 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -6,8 +6,7 @@
 /// compiled to JavaScript.
 library dart2js.constant_system;
 
-//import '../common/elements.dart' show CommonElements;
-import 'common_elements_for_constants.dart';
+import '../common/elements.dart' show CommonElements;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import 'values.dart';
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index ccabdeb..b12d2da 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -5,16 +5,13 @@
 library dart2js.constants.values;
 
 import '../common.dart';
+import '../common/elements.dart' show CommonElements;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../deferred_load/output_unit_migrated.dart' show OutputUnit;
 import '../js/js.dart' as js;
 import '../util/util.dart';
 
-import 'common_elements_for_constants.dart';
-// TODO(48820): When CommonElements is migrated, replace this import with
-//   import '../common/elements.dart' show CommonElements;
-
 enum ConstantValueKind {
   FUNCTION,
   NULL,
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 6f217cd..47e94c1 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import '../common/elements.dart' show CommonElements;
 import '../common/names.dart';
 import '../options.dart';
 import '../serialization/serialization_interfaces.dart';
@@ -1696,22 +1697,10 @@
   }
 }
 
-/// The subset of CommonElements methods needed for DartTypes.
-// TODO(48820): Replace with CommonElements once that is migrated.
-abstract class CommonElementsForDartTypes {
-  InterfaceType get nullType;
-  InterfaceType get intType;
-  InterfaceType get doubleType;
-  InterfaceType get functionType;
-  InterfaceType get objectType;
-  InterfaceType get jsJavaScriptFunctionType;
-  InterfaceType futureType(DartType elementType);
-}
-
 /// Basic interface for the Dart type system.
 abstract class DartTypes {
   /// The types defined in 'dart:core'.
-  CommonElementsForDartTypes get commonElements;
+  CommonElements get commonElements;
 
   bool get useLegacySubtyping;
 
diff --git a/pkg/compiler/lib/src/js_backend/native_data.dart b/pkg/compiler/lib/src/js_backend/native_data.dart
index f4f71f9..edc6de8 100644
--- a/pkg/compiler/lib/src/js_backend/native_data.dart
+++ b/pkg/compiler/lib/src/js_backend/native_data.dart
@@ -18,6 +18,8 @@
 import '../serialization/serialization.dart';
 import '../util/util.dart';
 
+import 'native_data_interfaces.dart' as interfaces;
+
 class NativeBasicDataBuilder {
   bool _closed = false;
 
@@ -133,7 +135,7 @@
 /// Basic information for native classes and js-interop libraries and classes.
 ///
 /// This information is computed during loading using [NativeBasicDataBuilder].
-class NativeBasicData {
+class NativeBasicData implements interfaces.NativeBasicData {
   /// Tag used for identifying serialized [NativeBasicData] objects in a
   /// debugging data stream.
   static const String tag = 'native-basic-data';
@@ -261,6 +263,7 @@
   /// A class is marked as native either through the `@Native(...)` annotation
   /// allowed for internal libraries or via the typed JavaScriptInterop
   /// mechanism allowed for user libraries.
+  @override
   bool isNativeClass(ClassEntity element) {
     if (isJsInteropClass(element)) return true;
     return _nativeClassTagInfo.containsKey(element);
@@ -286,6 +289,7 @@
   }
 
   /// Returns `true` if [element] is a JsInterop class.
+  @override
   bool isJsInteropClass(ClassEntity element) {
     return _jsInteropClasses.containsKey(element);
   }
diff --git a/pkg/compiler/lib/src/js_backend/native_data_interfaces.dart b/pkg/compiler/lib/src/js_backend/native_data_interfaces.dart
new file mode 100644
index 0000000..405d858
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/native_data_interfaces.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2022, 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:compiler/src/elements/entities.dart';
+
+/// This is a facade interface for the members of NativeBasicData that are
+/// required by other migrated classes.
+// TODO(48820): When NativeBasicData is migrated, remove this facade.
+abstract class NativeBasicData {
+  bool isJsInteropClass(ClassEntity element);
+
+  bool isNativeClass(ClassEntity element);
+}
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index b6d3d6b..f76178a 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -18,8 +18,9 @@
 
 import 'element_map.dart';
 import 'elements.dart' show JGeneratorBody;
+import 'locals_interfaces.dart' as interfaces;
 
-class GlobalLocalsMap {
+class GlobalLocalsMap implements interfaces.GlobalLocalsMap {
   /// Tag used for identifying serialized [GlobalLocalsMap] objects in a
   /// debugging data stream.
   static const String tag = 'global-locals-map';
diff --git a/pkg/compiler/lib/src/js_model/locals_interfaces.dart b/pkg/compiler/lib/src/js_model/locals_interfaces.dart
new file mode 100644
index 0000000..7c4267c
--- /dev/null
+++ b/pkg/compiler/lib/src/js_model/locals_interfaces.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// This is a facade interface for the members of GlobalLocalsMap that are
+/// required by other migrated classes.
+// TODO(48820): When GlobalLocalsMap is migrated, remove this facade.
+abstract class GlobalLocalsMap {}
diff --git a/pkg/compiler/lib/src/serialization/helpers.dart b/pkg/compiler/lib/src/serialization/helpers.dart
index 46791ba..2e395b7 100644
--- a/pkg/compiler/lib/src/serialization/helpers.dart
+++ b/pkg/compiler/lib/src/serialization/helpers.dart
@@ -133,8 +133,6 @@
       _sink.writeBool(parameter.isRequired);
       _sink._writeDartTypeNode(parameter.type, functionTypeVariables);
     }
-    _sink._writeDartTypeNode(node.typedefType, functionTypeVariables,
-        allowNull: true);
     _sink.end(functionTypeNodeTag);
   }
 
diff --git a/pkg/compiler/lib/src/serialization/source.dart b/pkg/compiler/lib/src/serialization/source.dart
index efe6512..b09e780 100644
--- a/pkg/compiler/lib/src/serialization/source.dart
+++ b/pkg/compiler/lib/src/serialization/source.dart
@@ -767,13 +767,11 @@
           namedParameters[index] =
               ir.NamedType(name, type, isRequired: isRequired);
         }
-        ir.TypedefType typedefType = _readDartTypeNode(functionTypeVariables);
         end(functionTypeNodeTag);
         return ir.FunctionType(positionalParameters, returnType, nullability,
             namedParameters: namedParameters,
             typeParameters: typeParameters,
-            requiredParameterCount: requiredParameterCount,
-            typedefType: typedefType);
+            requiredParameterCount: requiredParameterCount);
 
       case DartTypeNodeKind.interfaceType:
         ir.Class cls = readClassNode();
diff --git a/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart
index ce5ed5b..02c6b57 100644
--- a/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart
@@ -25,14 +25,26 @@
         super(null, 0, name, compilationUnit, charOffset);
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return type.withDeclaredNullability(nullabilityBuilder.build(library));
   }
 
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType> arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType> arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return type.withDeclaredNullability(nullability);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 4ecde96..8f483a0 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -18,13 +18,14 @@
         Supertype,
         getAsTypeArguments;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/unaliasing.dart';
 import 'package:kernel/text/text_serialization_verifier.dart';
 
 import '../fasta_codes.dart';
 import '../modifier.dart';
 import '../problems.dart' show internalProblem, unhandled;
 import '../scope.dart';
+import '../source/source_library_builder.dart';
 import '../type_inference/type_schema.dart' show UnknownType;
 import 'builder.dart';
 import 'declaration_builder.dart';
@@ -98,10 +99,7 @@
 
   InterfaceType rawType(Nullability nullability);
 
-  List<DartType> buildTypeArguments(
-      LibraryBuilder library, List<TypeBuilder>? arguments);
-
-  Supertype buildSupertype(
+  List<DartType> buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments);
 
   Supertype buildMixedInType(
@@ -310,8 +308,14 @@
   }
 
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType>? arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     assert(arguments == null || cls.typeParameters.length == arguments.length);
     if (isNullClass) {
       return const NullType();
@@ -324,31 +328,33 @@
         return new FutureOrType(arguments!.single, nullability);
       }
     }
-    return arguments == null
+    DartType type = arguments == null
         ? rawType(nullability)
         : new InterfaceType(cls, nullability, arguments);
+    if (typeVariablesCount != 0 && library is SourceLibraryBuilder) {
+      library.registerBoundsCheck(type, fileUri, charOffset, typeUse,
+          inferred: !hasExplicitTypeArguments);
+    }
+    return type;
   }
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
-    return buildTypeWithBuiltArguments(
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
+    return buildAliasedTypeWithBuiltArguments(
         library,
         nullabilityBuilder.build(library),
-        buildTypeArguments(library, arguments));
-  }
-
-  @override
-  Supertype buildSupertype(
-      LibraryBuilder library, List<TypeBuilder>? arguments) {
-    Class cls = isPatch ? origin.cls : this.cls;
-    List<DartType> typeArguments = buildTypeArguments(library, arguments);
-    if (!library.isNonNullableByDefault) {
-      for (int i = 0; i < typeArguments.length; ++i) {
-        typeArguments[i] = legacyErasure(typeArguments[i]);
-      }
-    }
-    return new Supertype(cls, typeArguments);
+        buildAliasedTypeArguments(library, arguments),
+        typeUse,
+        fileUri,
+        charOffset,
+        hasExplicitTypeArguments: hasExplicitTypeArguments);
   }
 
   @override
@@ -356,7 +362,11 @@
       LibraryBuilder library, List<TypeBuilder>? arguments) {
     Class cls = isPatch ? origin.cls : this.cls;
     if (arguments != null) {
-      return new Supertype(cls, buildTypeArguments(library, arguments));
+      List<DartType> typeArguments =
+          buildAliasedTypeArguments(library, arguments);
+      typeArguments = unaliasTypes(typeArguments,
+          legacyEraseAliases: !library.isNonNullableByDefault)!;
+      return new Supertype(cls, typeArguments);
     } else {
       return new Supertype(
           cls,
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index f0deb80..5272f53 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -72,14 +72,24 @@
   }
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     if (library is SourceLibraryBuilder &&
         library.libraryFeatures.extensionTypes.isEnabled) {
-      return buildTypeWithBuiltArguments(
+      return buildAliasedTypeWithBuiltArguments(
           library,
           nullabilityBuilder.build(library),
-          _buildTypeArguments(library, arguments));
+          _buildAliasedTypeArguments(library, arguments),
+          typeUse,
+          fileUri,
+          charOffset,
+          hasExplicitTypeArguments: hasExplicitTypeArguments);
     } else {
       throw new UnsupportedError("ExtensionBuilder.buildType is not supported"
           "in library '${library.importUri}'.");
@@ -87,8 +97,14 @@
   }
 
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType> arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType> arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     if (library is SourceLibraryBuilder &&
         library.libraryFeatures.extensionTypes.isEnabled) {
       return new ExtensionType(extension, nullability, arguments);
@@ -102,7 +118,7 @@
   @override
   int get typeVariablesCount => typeParameters?.length ?? 0;
 
-  List<DartType> _buildTypeArguments(
+  List<DartType> _buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments) {
     if (arguments == null && typeParameters == null) {
       return <DartType>[];
@@ -111,7 +127,9 @@
     if (arguments == null && typeParameters != null) {
       List<DartType> result =
           new List<DartType>.generate(typeParameters!.length, (int i) {
-        return typeParameters![i].defaultType!.build(library);
+        return typeParameters![i]
+            .defaultType!
+            .buildAliased(library, TypeUse.defaultTypeAsTypeArgument);
       }, growable: true);
       if (library is SourceLibraryBuilder) {
         library.inferredTypes.addAll(result);
@@ -133,7 +151,7 @@
     assert(arguments!.length == typeVariablesCount);
     List<DartType> result =
         new List<DartType>.generate(arguments!.length, (int i) {
-      return arguments[i].build(library);
+      return arguments[i].buildAliased(library, TypeUse.typeArgument);
     }, growable: true);
     return result;
   }
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 44e408f..92bcd1d 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
@@ -48,7 +48,12 @@
   }
 
   @override
-  DartType build(LibraryBuilder library) {
+  DartType build(LibraryBuilder library, TypeUse typeUse) {
+    return type;
+  }
+
+  @override
+  DartType buildAliased(LibraryBuilder library, TypeUse typeUse) {
     return type;
   }
 
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 68f16e3..2832049 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
@@ -145,7 +145,7 @@
   VariableDeclaration build(
       SourceLibraryBuilder library, int functionNestingLevel) {
     if (variable == null) {
-      DartType? builtType = type?.build(library);
+      DartType? builtType = type?.build(library, TypeUse.parameterType);
       variable = new VariableDeclarationImpl(
           name == noNameSentinel ? null : name, functionNestingLevel,
           type: builtType,
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 f972a4d0..30493a8 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
@@ -12,6 +12,7 @@
         NamedType,
         Supertype,
         TypeParameter;
+import 'package:kernel/src/unaliasing.dart';
 
 import '../fasta_codes.dart' show messageSupertypeIsFunction, noLength;
 
@@ -84,19 +85,29 @@
   }
 
   @override
-  FunctionType build(LibraryBuilder library) {
-    return _type ??= _buildInternal(library);
+  FunctionType build(LibraryBuilder library, TypeUse typeUse) {
+    return _type ??= _buildInternal(library, typeUse) as FunctionType;
   }
 
-  FunctionType _buildInternal(LibraryBuilder library) {
+  DartType _buildInternal(LibraryBuilder library, TypeUse typeUse) {
+    DartType aliasedType = buildAliased(library, typeUse);
+    return unalias(aliasedType,
+        legacyEraseAliases: !library.isNonNullableByDefault);
+  }
+
+  @override
+  DartType buildAliased(LibraryBuilder library, TypeUse typeUse) {
     DartType builtReturnType =
-        returnType?.build(library) ?? const DynamicType();
+        returnType?.buildAliased(library, TypeUse.returnType) ??
+            const DynamicType();
     List<DartType> positionalParameters = <DartType>[];
     List<NamedType>? namedParameters;
     int requiredParameterCount = 0;
     if (formals != null) {
       for (ParameterBuilder formal in formals!) {
-        DartType type = formal.type?.build(library) ?? const DynamicType();
+        DartType type =
+            formal.type?.buildAliased(library, TypeUse.parameterType) ??
+                const DynamicType();
         if (formal.isPositional) {
           positionalParameters.add(type);
           if (formal.isRequiredPositional) requiredParameterCount++;
@@ -116,7 +127,7 @@
       for (TypeVariableBuilder t in typeVariables!) {
         typeParameters.add(t.parameter);
         // Build the bound to detect cycles in typedefs.
-        t.bound?.build(library);
+        t.bound?.build(library, TypeUse.typeParameterBound);
       }
     }
     return new FunctionType(positionalParameters, builtReturnType,
diff --git a/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart
index 277a400..fb47efbb 100644
--- a/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart
@@ -20,15 +20,28 @@
   String get debugName => "FutureOrTypeDeclarationBuilder";
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return new FutureOrType(
-        arguments!.single.build(library), nullabilityBuilder.build(library));
+        arguments!.single.buildAliased(library, TypeUse.typeArgument),
+        nullabilityBuilder.build(library));
   }
 
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType> arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType> arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return new FutureOrType(arguments.single, nullability);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart
index 5f2b68b..82d2ccc 100644
--- a/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart
@@ -33,15 +33,29 @@
   Uri? get fileUri => message.uri;
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
-    return buildTypeWithBuiltArguments(library, null, null);
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
+    return buildAliasedTypeWithBuiltArguments(
+        library, null, null, typeUse, fileUri, charOffset,
+        hasExplicitTypeArguments: hasExplicitTypeArguments);
   }
 
   /// [Arguments] have already been built.
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability? nullability, List<DartType>? arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability? nullability,
+      List<DartType>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     if (!suppressMessage) {
       library.addProblem(message.messageObject, message.charOffset,
           message.length, message.uri,
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 f4f08fe..036806f 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
@@ -5,6 +5,8 @@
 library fasta.named_type_builder;
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/unaliasing.dart';
 
 import '../fasta_codes.dart'
     show
@@ -25,15 +27,11 @@
         templateTypeArgumentMismatch,
         templateTypeArgumentsOnTypeVariable,
         templateTypeNotFound;
-
 import '../identifiers.dart' show Identifier, QualifiedName, flattenName;
-
 import '../problems.dart' show unhandled;
-
 import '../scope.dart';
-
 import '../source/source_library_builder.dart';
-
+import '../uris.dart';
 import 'builder.dart';
 import 'builtin_type_declaration_builder.dart';
 import 'class_builder.dart';
@@ -114,6 +112,8 @@
 
   DartType? _type;
 
+  final bool hasExplicitTypeArguments;
+
   NamedTypeBuilder(this.name, this.nullabilityBuilder,
       {this.arguments,
       this.fileUri,
@@ -122,7 +122,8 @@
       bool forTypeLiteral: false})
       : assert(name is String || name is QualifiedName),
         this._instanceTypeVariableAccess = instanceTypeVariableAccess,
-        this._forTypeLiteral = forTypeLiteral;
+        this._forTypeLiteral = forTypeLiteral,
+        this.hasExplicitTypeArguments = arguments != null;
 
   NamedTypeBuilder.forDartType(DartType this._type,
       TypeDeclarationBuilder this._declaration, this.nullabilityBuilder,
@@ -132,7 +133,8 @@
             InstanceTypeVariableAccessState.Unexpected,
         this.fileUri = null,
         this.charOffset = null,
-        this._forTypeLiteral = false;
+        this._forTypeLiteral = false,
+        this.hasExplicitTypeArguments = arguments != null;
 
   NamedTypeBuilder.fromTypeDeclarationBuilder(
       TypeDeclarationBuilder this._declaration, this.nullabilityBuilder,
@@ -144,7 +146,8 @@
       : this.name = _declaration.name,
         this._forTypeLiteral = false,
         this._instanceTypeVariableAccess = instanceTypeVariableAccess,
-        this._type = type;
+        this._type = type,
+        this.hasExplicitTypeArguments = arguments != null;
 
   NamedTypeBuilder.forInvalidType(
       String this.name, this.nullabilityBuilder, LocatedMessage message,
@@ -156,7 +159,8 @@
         this._instanceTypeVariableAccess =
             InstanceTypeVariableAccessState.Unexpected,
         this._forTypeLiteral = false,
-        this._type = const InvalidType();
+        this._type = const InvalidType(),
+        this.hasExplicitTypeArguments = false;
 
   @override
   TypeDeclarationBuilder? get declaration => _declaration;
@@ -378,55 +382,57 @@
   }
 
   @override
-  DartType build(LibraryBuilder library) {
-    return _type ??= _buildInternal(library);
+  DartType build(LibraryBuilder library, TypeUse typeUse) {
+    return _type ??= _buildInternal(library, typeUse);
   }
 
-  DartType _declarationBuildType(LibraryBuilder library) {
-    if (_forTypeLiteral) {
-      return declaration!
-          .buildTypeLiteralType(library, nullabilityBuilder, arguments);
-    } else {
-      return declaration!.buildType(library, nullabilityBuilder, arguments);
-    }
+  DartType _buildInternal(LibraryBuilder library, TypeUse typeUse) {
+    DartType aliasedType = _buildAliasedInternal(library, typeUse);
+    return unalias(aliasedType,
+        legacyEraseAliases:
+            !_forTypeLiteral && !library.isNonNullableByDefault);
   }
 
-  DartType _buildInternal(LibraryBuilder library) {
+  @override
+  DartType buildAliased(LibraryBuilder library, TypeUse typeUse) {
+    return _buildAliasedInternal(library, typeUse);
+  }
+
+  DartType _buildAliasedInternal(LibraryBuilder library, TypeUse typeUse) {
     assert(declaration != null, "Declaration has not been resolved on $this.");
-    if (library is SourceLibraryBuilder) {
-      int uncheckedTypedefTypeCount = library.uncheckedTypedefTypes.length;
-      DartType builtType = _declarationBuildType(library);
-      // Set locations for new unchecked TypedefTypes for error reporting.
-      for (int i = uncheckedTypedefTypeCount;
-          i < library.uncheckedTypedefTypes.length;
-          ++i) {
-        // TODO(johnniwinther): Pass the uri/offset through the build methods
-        // to avoid this.
-        library.uncheckedTypedefTypes[i]
-          ..fileUri ??= fileUri
-          ..offset ??= charOffset;
-      }
-      return builtType;
-    } else {
-      return _declarationBuildType(library);
-    }
+    return declaration!.buildAliasedType(library, nullabilityBuilder, arguments,
+        typeUse, fileUri ?? missingUri, charOffset ?? TreeNode.noOffset,
+        hasExplicitTypeArguments: hasExplicitTypeArguments);
   }
 
   @override
   Supertype? buildSupertype(LibraryBuilder library) {
     TypeDeclarationBuilder declaration = this.declaration!;
     if (declaration is ClassBuilder) {
-      if (declaration.isNullClass && !library.mayImplementRestrictedTypes) {
-        library.addProblem(
-            templateExtendingRestricted.withArguments(declaration.name),
-            charOffset!,
-            noLength,
-            fileUri);
+      if (declaration.isNullClass) {
+        if (!library.mayImplementRestrictedTypes) {
+          library.addProblem(
+              templateExtendingRestricted.withArguments(declaration.name),
+              charOffset!,
+              noLength,
+              fileUri);
+        }
       }
-      return declaration.buildSupertype(library, arguments);
+      DartType type = build(library, TypeUse.superType);
+      if (type is InterfaceType) {
+        if (!library.isNonNullableByDefault) {
+          // This "normalizes" type argument `Never*` to `Null`.
+          type = legacyErasure(type) as InterfaceType;
+        }
+        return new Supertype(type.classNode, type.typeArguments);
+      } else if (type is FutureOrType) {
+        return new Supertype(declaration.cls, [type.typeArgument]);
+      } else if (type is NullType) {
+        return new Supertype(declaration.cls, []);
+      }
     } else if (declaration is TypeAliasBuilder) {
       TypeAliasBuilder aliasBuilder = declaration;
-      DartType type = build(library);
+      DartType type = build(library, TypeUse.superType);
       if (type is InterfaceType && type.nullability != Nullability.nullable) {
         return new Supertype(type.classNode, type.typeArguments);
       } else if (type is NullType) {
@@ -490,7 +496,7 @@
       return declaration.buildMixedInType(library, arguments);
     } else if (declaration is TypeAliasBuilder) {
       TypeAliasBuilder aliasBuilder = declaration;
-      DartType type = build(library);
+      DartType type = build(library, TypeUse.mixedInType);
       if (type is InterfaceType && type.nullability != Nullability.nullable) {
         return new Supertype(type.classNode, type.typeArguments);
       }
diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
index 2e2c1b5..20389ed 100644
--- a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
@@ -10,27 +10,40 @@
 import 'library_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
+import '../uris.dart';
 
 class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
   final LibraryBuilder coreLibrary;
 
   NeverTypeDeclarationBuilder(DartType type, this.coreLibrary, int charOffset)
       : super("Never", type, coreLibrary, charOffset) {
-    assert(coreLibrary.importUri == Uri.parse('dart:core'));
+    assert(coreLibrary.importUri == dartCore);
   }
 
   @override
   String get debugName => "NeverTypeDeclarationBuilder";
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return type.withDeclaredNullability(nullabilityBuilder.build(library));
   }
 
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType> arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType> arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return type.withDeclaredNullability(nullability);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
index 818c6f0..945aa07 100644
--- a/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
@@ -20,14 +20,26 @@
   String get debugName => "NullTypeBuilder";
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return type;
   }
 
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType> arguments) {
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType> arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     return type;
   }
 }
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 ad7bceb..3b977bc 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
@@ -5,9 +5,6 @@
 library fasta.function_type_alias_builder;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/src/legacy_erasure.dart';
-
-import 'package:kernel/type_algebra.dart' show substitute, uniteNullabilities;
 
 import '../fasta_codes.dart'
     show
@@ -55,12 +52,7 @@
 
   DartType buildThisType();
 
-  /// [arguments] have already been built.
-  @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType>? arguments);
-
-  List<DartType> buildTypeArguments(
+  List<DartType> buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments);
 
   /// Returns `true` if this typedef is an alias of the `Null` type.
@@ -153,81 +145,50 @@
 
   /// [arguments] have already been built.
   @override
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType>? arguments) {
-    DartType thisType = buildThisType();
-    if (const DynamicType() == thisType) return thisType;
-    Nullability adjustedNullability =
-        isNullAlias ? Nullability.nullable : nullability;
-    DartType result = thisType.withDeclaredNullability(adjustedNullability);
-    // TODO(johnniwinther): Couldn't [arguments] be null and
-    // `typedef.typeParameters` be non-empty?
-    if (typedef.typeParameters.isEmpty && arguments == null) return result;
-    Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
-    for (int i = 0; i < typedef.typeParameters.length; i++) {
-      substitution[typedef.typeParameters[i]] = arguments![i];
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
+    buildThisType();
+    TypedefType type = new TypedefType(typedef, nullability, arguments);
+    if (library is SourceLibraryBuilder) {
+      if (typeVariablesCount != 0) {
+        library.registerBoundsCheck(type, fileUri, charOffset, typeUse,
+            inferred: !hasExplicitTypeArguments);
+      }
+      if (!library.libraryFeatures.genericMetadata.isEnabled) {
+        library.registerGenericFunctionTypeCheck(type, fileUri, charOffset);
+      }
     }
-    // The following adds the built type to the list of unchecked typedef types
-    // of the client library. It is needed because the type is built unaliased,
-    // and at the time of the check it wouldn't be possible to see if the type
-    // arguments to the generic typedef conform to the bounds without preserving
-    // the TypedefType for the delayed check.
-    if (library is SourceLibraryBuilder &&
-        arguments!.isNotEmpty &&
-        thisType is! FunctionType) {
-      library.uncheckedTypedefTypes.add(new UncheckedTypedefType(
-          new TypedefType(typedef, nullability, arguments)));
-    }
-    return substitute(result, substitution);
+
+    return type;
   }
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
-    return buildTypeInternal(library, nullabilityBuilder, arguments,
-        performLegacyErasure: true);
-  }
-
-  @override
-  DartType buildTypeLiteralType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
-    return buildTypeInternal(library, nullabilityBuilder, arguments,
-        performLegacyErasure: false);
-  }
-
-  DartType buildTypeInternal(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments,
-      {required bool performLegacyErasure}) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     DartType thisType = buildThisType();
     if (thisType is InvalidType) return thisType;
 
-    // The following won't work if the right-hand side of the typedef is a
-    // FutureOr.
-    Nullability nullability;
-    if (isNullAlias) {
-      // Null is always nullable.
-      nullability = Nullability.nullable;
-    } else if (!parent.isNonNullableByDefault ||
-        !library.isNonNullableByDefault) {
-      // The typedef is defined or used in an opt-out library so the nullability
-      // is based on the use site alone.
-      nullability = nullabilityBuilder.build(library);
-    } else {
-      nullability = uniteNullabilities(
-          thisType.declaredNullability, nullabilityBuilder.build(library));
-    }
-    DartType result;
-    if (typedef.typeParameters.isEmpty && arguments == null) {
-      result = thisType.withDeclaredNullability(nullability);
-    } else {
-      // Otherwise, substitute.
-      result = buildTypeWithBuiltArguments(
-          library, nullability, buildTypeArguments(library, arguments));
-    }
-    if (performLegacyErasure && !library.isNonNullableByDefault) {
-      result = legacyErasure(result);
-    }
-    return result;
+    Nullability nullability = nullabilityBuilder.build(library);
+    return buildAliasedTypeWithBuiltArguments(
+        library,
+        nullability,
+        buildAliasedTypeArguments(library, arguments),
+        typeUse,
+        fileUri,
+        charOffset,
+        hasExplicitTypeArguments: hasExplicitTypeArguments);
   }
 
   TypeDeclarationBuilder? _cachedUnaliasedDeclaration;
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 72d12fa..0090e6f 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -13,6 +13,249 @@
 import 'type_declaration_builder.dart';
 import 'type_variable_builder.dart';
 
+enum TypeUse {
+  /// A type used as the type of a parameter.
+  ///
+  /// For instance `X` and `Y` in
+  ///
+  ///    method(X p, {Y q}) {}
+  ///
+  parameterType,
+
+  /// A type used as the type of a field.
+  ///
+  /// For instance `X` and `Y` in
+  ///
+  ///    X topLevelField;
+  ///    class Class {
+  ///      Y instanceField;
+  ///    }
+  ///
+  fieldType,
+
+  /// A type used as the return type of a function.
+  ///
+  /// For instance `X` in
+  ///
+  ///    X method() { ... }
+  ///
+  returnType,
+
+  /// A type used as a type argument to a constructor invocation.
+  ///
+  /// For instance `X` in
+  ///
+  ///   class Class<T> {}
+  ///   method() => new Class<X>();
+  ///
+  constructorTypeArgument,
+
+  /// A type used as a type argument to a redirecting factory constructor
+  /// declaration.
+  ///
+  /// For instance `X` in
+  ///
+  ///   class Class<T> {
+  ///     Class();
+  ///     factory Class.redirect() = Class<X>;
+  ///   }
+  ///
+  redirectionTypeArgument,
+
+  /// A type used as the bound of a type parameter.
+  ///
+  /// For instance `X` and `Y` in
+  ///
+  ///    method<T extends X>() {}
+  ///    class Class<S extends Y> {}
+  ///
+  typeParameterBound,
+
+  /// A type computed as the default type for a type parameter.
+  ///
+  /// For instance the type `X` computed for `T` and the type `dynamic` computed
+  /// for `S`.
+  ///
+  ///    method<T extends X>() {}
+  ///    class Class<S> {}
+  ///
+  typeParameterDefaultType,
+
+  /// A type used as a type argument in the instantiation of a tear off.
+  ///
+  /// For instance `X` and `Y` in
+  ///
+  ///    class Class<S> {}
+  ///    method<T>() {
+  ///      Class<X>.new;
+  ///      method<Y>;
+  ///    }
+  ///
+  tearOffTypeArgument,
+
+  /// A type used in an extends, with or implements clause.
+  ///
+  /// For instance `X`, `Y`, `Z` in
+  ///
+  ///    class Class extends X with Y implements Z {}
+  ///
+  // TODO(johnniwinther): The probably enclosed the mixin on clause. Is this
+  // a correct handling wrt well-boundedness?
+  superType,
+
+  /// A type used in a with clause.
+  ///
+  /// For instance `X` in
+  ///
+  ///    class Class extends X {}
+  ///
+  /// This type use creates an intermediate type used for mixin inference. The
+  /// type is not check for well-boundedness and contains [UnknownType] where
+  /// type arguments are omitted.
+  mixedInType,
+
+  /// A type used in the on clause of an extension declaration.
+  ///
+  /// For instance `X` in
+  ///
+  ///    extension Extension on X {}
+  ///
+  extensionOnType,
+
+  /// A type used as the definition of a typedef.
+  ///
+  /// For instance `X`, `void Function()` in
+  ///
+  ///    typedef Typedef1 = X;
+  ///    typedef void Typedef2(); // The unaliased type is `void Function()`.
+  ///
+  typedefAlias,
+
+  /// An internally created function type used when build local functions.
+  functionSignature,
+
+  /// The this type of an enum.
+  // TODO(johnniwinther): This is doesn't currently have the correct value
+  // and/or well-boundedness checking.
+  enumSelfType,
+
+  /// A type used as a type literal.
+  ///
+  /// For instance `X` in
+  ///
+  ///    method() => X;
+  ///
+  /// where `X` is the name of a class.
+  typeLiteral,
+
+  /// A type used as a type argument to a literal.
+  ///
+  /// For instance `X`, `Y`, `Z`, and `W` in
+  ///
+  ///    method() {
+  ///      <X>[];
+  ///      <Y>{};
+  ///      <Z, W>{};
+  ///    }
+  ///
+  literalTypeArgument,
+
+  /// A type used as a type argument in an invocation.
+  ///
+  /// For instance `X`, `Y`, and `Z` in
+  ///
+  ///   staticMethod<T>(Class c, void Function<S>() f) {
+  ///     staticMethod<X>(c, f);
+  ///     c.instanceMethod<Y>();
+  ///     f<Z>();
+  ///   }
+  ///   class Class {
+  ///     instanceMethod<U>() {}
+  ///   }
+  invocationTypeArgument,
+
+  /// A type used as the type in an is-test.
+  ///
+  /// For instance `X` in
+  ///
+  ///    method(o) => o is X;
+  ///
+  isType,
+
+  /// A type used as the type in an as-cast.
+  ///
+  /// For instance `X` in
+  ///
+  ///    method(o) => o as X;
+  ///
+  asType,
+
+  /// A type used as the type of local variable.
+  ///
+  /// For instance `X` in
+  ///
+  ///    method() {
+  ///      X local;
+  ///    }
+  ///
+  variableType,
+
+  /// A type used as the catch type in a catch clause.
+  ///
+  /// For instance `X` in
+  ///
+  ///    method() {
+  ///      try {
+  ///      } on X catch (e) {
+  ///      }
+  ///    }
+  ///
+  catchType,
+
+  /// A type used as an instantiation argument.
+  ///
+  /// For instance `X` in
+  ///
+  ///   method(void Function<T>() f) {
+  ///     f<X>;
+  ///   }
+  ///
+  instantiation,
+
+  /// A type used as a type argument within another type.
+  ///
+  /// For instance `X`, `Y`, `Z` and `W` in
+  ///
+  ///   method(List<X> a, Y Function(Z) f) {}
+  ///   class Class implements List<W> {}
+  ///
+  typeArgument,
+
+  /// The default type of a type parameter used as the type argument in a raw
+  /// type.
+  ///
+  /// For instance `X` implicitly inside `Class<X>` in the type of `cls` in
+  ///
+  ///   class Class<T extends X> {}
+  ///   Class cls;
+  ///
+  defaultTypeAsTypeArgument,
+
+  /// A type from a deferred library. This is an error case.
+  ///
+  /// For instance `X` in
+  ///
+  ///   import 'foo.dart' deferred as prefix;
+  ///
+  ///   prefix.X field;
+  ///
+  deferredTypeError,
+
+  /// A type used as a type argument in the construction of a type through the
+  /// macro API.
+  macroTypeArgument,
+}
+
 abstract class TypeBuilder {
   const TypeBuilder();
 
@@ -60,7 +303,23 @@
 
   String get fullNameForErrors => "${printOn(new StringBuffer())}";
 
-  DartType build(LibraryBuilder library);
+  /// Creates the [DartType] from this [TypeBuilder] that doesn't contain
+  /// [TypedefType].
+  ///
+  /// [library] is used to determine nullabilities and for registering well-
+  /// boundedness checks on the created type. [typeUse] describes how the
+  /// type is used which determine which well-boundedness checks are applied.
+  DartType build(LibraryBuilder library, TypeUse typeUse);
+
+  /// Creates the [DartType] from this [TypeBuilder] that contains
+  /// [TypedefType]. This is used to create types internal on which well-
+  /// boundedness checks can be permit. Calls from outside the [TypeBuilder]
+  /// subclasses should generally use [build] instead.
+  ///
+  /// [library] is used to determine nullabilities and for registering well-
+  /// boundedness checks on the created type. [typeUse] describes how the
+  /// type is used which determine which well-boundedness checks are applied.
+  DartType buildAliased(LibraryBuilder library, TypeUse typeUse);
 
   Supertype? buildSupertype(LibraryBuilder library);
 
diff --git a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
index 1e51ffb..d8df153 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
@@ -33,22 +33,32 @@
 
   /// Creates the [DartType] corresponding to this declaration applied with
   /// [arguments] in [library] with the syntactical nullability defined by
-  /// [nullabilityBuilder].
+  /// [nullabilityBuilder]. The created type will contain [TypedefType] instead
+  /// of their unaliased type.
   ///
   /// For instance, if this declaration is a class declaration `C`, then
   /// an occurrence of `C<int>?` in a null safe library `lib1` would call
   /// `buildType(<lib1>, <?>, [<int>])` to create `C<int>?`, or `C<int>` in a
   /// legacy library `lib2` call `buildType(<lib2>, <> [<int>]` to create
   /// `C<int*>*`.
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments);
-
-  DartType buildTypeLiteralType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments);
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments});
 
   /// [arguments] have already been built.
-  DartType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType> arguments);
+  DartType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType> arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments});
 }
 
 abstract class TypeDeclarationBuilderImpl extends ModifierBuilderImpl
@@ -85,10 +95,4 @@
 
   @override
   int get typeVariablesCount => 0;
-
-  @override
-  DartType buildTypeLiteralType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
-    return buildType(library, nullabilityBuilder, arguments);
-  }
 }
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 79a2d15..3cc96e2 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
@@ -15,6 +15,7 @@
 
 import '../scope.dart';
 import '../source/source_library_builder.dart';
+import '../uris.dart';
 import '../util/helpers.dart';
 
 import 'builder.dart';
@@ -119,11 +120,15 @@
   }
 
   @override
-  DartType buildType(LibraryBuilder library,
-      NullabilityBuilder nullabilityBuilder, List<TypeBuilder>? arguments) {
+  DartType buildAliasedType(
+      LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder,
+      List<TypeBuilder>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     if (arguments != null) {
-      int charOffset = -1; // TODO(ahe): Provide these.
-      Uri? fileUri = null; // TODO(ahe): Provide these.
       library.addProblem(
           templateTypeArgumentsOnTypeVariable.withArguments(name),
           charOffset,
@@ -148,26 +153,34 @@
     } else {
       nullability = nullabilityBuilder.build(library);
     }
-    TypeParameterType type =
-        buildTypeWithBuiltArguments(library, nullability, null);
+    TypeParameterType type = buildAliasedTypeWithBuiltArguments(
+        library, nullability, null, typeUse, fileUri, charOffset,
+        hasExplicitTypeArguments: hasExplicitTypeArguments);
     if (needsPostUpdate) {
       if (library is SourceLibraryBuilder) {
-        library.registerPendingNullability(fileUri!, charOffset, type);
+        library.registerPendingNullability(
+            this.fileUri!, this.charOffset, type);
       } else {
         library.addProblem(
             templateInternalProblemUnfinishedTypeVariable.withArguments(
                 name, library.importUri),
-            charOffset,
+            this.charOffset,
             name.length,
-            fileUri);
+            this.fileUri);
       }
     }
     return type;
   }
 
   @override
-  TypeParameterType buildTypeWithBuiltArguments(LibraryBuilder library,
-      Nullability nullability, List<DartType>? arguments) {
+  TypeParameterType buildAliasedTypeWithBuiltArguments(
+      LibraryBuilder library,
+      Nullability nullability,
+      List<DartType>? arguments,
+      TypeUse typeUse,
+      Uri fileUri,
+      int charOffset,
+      {required bool hasExplicitTypeArguments}) {
     if (arguments != null) {
       int charOffset = -1; // TODO(ahe): Provide these.
       Uri? fileUri = null; // TODO(ahe): Provide these.
@@ -183,10 +196,17 @@
   void finish(
       LibraryBuilder library, ClassBuilder object, TypeBuilder dynamicType) {
     if (isPatch) return;
-    DartType objectType =
-        object.buildType(library, library.nullableBuilder, null);
+    DartType objectType = object.buildAliasedType(
+        library,
+        library.nullableBuilder,
+        null,
+        TypeUse.typeParameterBound,
+        fileUri ?? missingUri,
+        charOffset,
+        hasExplicitTypeArguments: false);
     if (identical(parameter.bound, TypeParameter.unsetBoundSentinel)) {
-      parameter.bound = bound?.build(library) ?? objectType;
+      parameter.bound =
+          bound?.build(library, TypeUse.typeParameterBound) ?? objectType;
     }
     // If defaultType is not set, initialize it to dynamic, unless the bound is
     // explicitly specified as Object, in which case defaultType should also be
@@ -194,10 +214,11 @@
     // explicit Object bound results in Object as the instantiated type.
     if (identical(
         parameter.defaultType, TypeParameter.unsetDefaultTypeSentinel)) {
-      parameter.defaultType = defaultType?.build(library) ??
+      parameter.defaultType = defaultType?.build(
+              library, TypeUse.typeParameterDefaultType) ??
           (bound != null && parameter.bound == objectType
               ? objectType
-              : dynamicType.build(library));
+              : dynamicType.build(library, TypeUse.typeParameterDefaultType));
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 66976b6..b245233 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -134,20 +134,21 @@
   int get typeVariablesCount => cls.typeParameters.length;
 
   @override
-  List<DartType> buildTypeArguments(
+  List<DartType> buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments) {
     // For performance reasons, [typeVariables] aren't restored from [target].
     // So, if [arguments] is null, the default types should be retrieved from
     // [cls.typeParameters].
     if (arguments == null) {
+      // TODO(johnniwinther): Use i2b here when needed.
       return new List<DartType>.generate(cls.typeParameters.length,
           (int i) => cls.typeParameters[i].defaultType,
           growable: true);
     }
 
     // [arguments] != null
-    return new List<DartType>.generate(
-        arguments.length, (int i) => arguments[i].build(library),
+    return new List<DartType>.generate(arguments.length,
+        (int i) => arguments[i].buildAliased(library, TypeUse.typeArgument),
         growable: true);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index a1584e3..7c94a5a 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -282,10 +282,6 @@
   }
 
   void addTypedef(Typedef typedef, Map<Name, Procedure>? tearOffs) {
-    DartType? type = typedef.type;
-    if (type is FunctionType && type.typedefType == null) {
-      unhandled("null", "addTypedef", typedef.fileOffset, typedef.fileUri);
-    }
     _addBuilder(
         typedef.name, new DillTypeAliasBuilder(typedef, tearOffs, this));
   }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 4665e61..bc00908 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -38,6 +38,8 @@
 
 import '../ticker.dart' show Ticker;
 
+import '../uris.dart';
+
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
 import 'dill_target.dart' show DillTarget;
@@ -226,6 +228,8 @@
       List<LocatedMessage>? context,
       bool problemOnLibrary: false,
       List<Uri>? involvedFiles}) {
+    assert(
+        fileUri != missingUri, "Message unexpectedly reported on missing uri.");
     severity ??= message.code.severity;
     if (severity == Severity.ignored) return null;
     String trace = """
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
index e777b52..92df2a0 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
@@ -73,12 +73,13 @@
   }
 
   @override
-  List<DartType> buildTypeArguments(
+  List<DartType> buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments) {
     // For performance reasons, [typeVariables] aren't restored from [target].
     // So, if [arguments] is null, the default types should be retrieved from
     // [cls.typeParameters].
     if (arguments == null) {
+      // TODO(johnniwinther): Use i2b here when needed.
       List<DartType> result =
           new List<DartType>.generate(typedef.typeParameters.length, (int i) {
         return typedef.typeParameters[i].defaultType;
@@ -89,7 +90,7 @@
     // [arguments] != null
     List<DartType> result =
         new List<DartType>.generate(arguments.length, (int i) {
-      return arguments[i].build(library);
+      return arguments[i].buildAliased(library, TypeUse.typeArgument);
     }, growable: true);
     return result;
   }
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index f786f84..f97e08e 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -1346,6 +1346,46 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    templateGenericFunctionTypeAsTypeArgumentThroughTypedef = const Template<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        problemMessageTemplate:
+            r"""Generic function type '#type' used as a type argument through typedef '#type2'.""",
+        correctionMessageTemplate:
+            r"""Try providing a non-generic function type explicitly.""",
+        withArguments:
+            _withArgumentsGenericFunctionTypeAsTypeArgumentThroughTypedef);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, bool isNonNullableByDefault)>
+    codeGenericFunctionTypeAsTypeArgumentThroughTypedef = const Code<
+            Message Function(
+                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
+        "GenericFunctionTypeAsTypeArgumentThroughTypedef",
+        analyzerCodes: <String>["GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsGenericFunctionTypeAsTypeArgumentThroughTypedef(
+    DartType _type, DartType _type2, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeGenericFunctionTypeAsTypeArgumentThroughTypedef,
+      problemMessage:
+          """Generic function type '${type}' used as a type argument through typedef '${type2}'.""" +
+              labeler.originMessages,
+      correctionMessage: """Try providing a non-generic function type explicitly.""",
+      arguments: {'type': _type, 'type2': _type2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateGenericFunctionTypeInferredAsActualTypeArgument = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
@@ -1535,224 +1575,6 @@
 const Template<
         Message Function(DartType _type, DartType _type2, String name,
             String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInReturnType = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        problemMessageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type.""",
-        correctionMessageTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentInReturnType);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentInReturnType = const Code<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInReturnType",
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInReturnType(DartType _type,
-    DartType _type2, String name, String name2, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInReturnType,
-      problemMessage:
-          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the return type.""" +
-              labeler.originMessages,
-      correctionMessage: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInSupertype = const Template<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        problemMessageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
-        correctionMessageTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentInSupertype);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)> codeIncorrectTypeArgumentInSupertype =
-    const Code<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInSupertype",
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertype(
-    DartType _type,
-    DartType _type2,
-    String name,
-    String name2,
-    String name3,
-    String name4,
-    bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  if (name3.isEmpty) throw 'No name provided';
-  name3 = demangleMixinApplicationName(name3);
-  if (name4.isEmpty) throw 'No name provided';
-  name4 = demangleMixinApplicationName(name4);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInSupertype,
-      problemMessage:
-          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
-              labeler.originMessages,
-      correctionMessage:
-          """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2,
-        'name3': name3,
-        'name4': name4
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInSupertypeInferred = const Template<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        problemMessageTemplate:
-            r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
-        correctionMessageTemplate:
-            r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentInSupertypeInferred);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentInSupertypeInferred = const Code<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInSupertypeInferred",
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertypeInferred(
-    DartType _type,
-    DartType _type2,
-    String name,
-    String name2,
-    String name3,
-    String name4,
-    bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  if (name3.isEmpty) throw 'No name provided';
-  name3 = demangleMixinApplicationName(name3);
-  if (name4.isEmpty) throw 'No name provided';
-  name4 = demangleMixinApplicationName(name4);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInSupertypeInferred,
-      problemMessage:
-          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
-              labeler.originMessages,
-      correctionMessage:
-          """Try specifying type arguments explicitly so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2,
-        'name3': name3,
-        'name4': name4
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
     templateIncorrectTypeArgumentInferred = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 String name2, bool isNonNullableByDefault)>(
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index e193567..ef54d70 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -135,6 +135,8 @@
 
 import 'util/textual_outline.dart' show textualOutline;
 
+import 'uris.dart' show dartCore;
+
 import 'hybrid_file_system.dart' show HybridFileSystem;
 
 import 'kernel/hierarchy/hierarchy_builder.dart' show ClassHierarchyBuilder;
@@ -655,7 +657,7 @@
           dillLibraryBuilder.exportScope.lookupLocalMember(name, setter: false);
       if (dillBuilder == null) {
         if ((name == 'dynamic' || name == 'Never') &&
-            sourceLibraryBuilder.importUri == Uri.parse('dart:core')) {
+            sourceLibraryBuilder.importUri == dartCore) {
           // The source library builder for dart:core has synthetically
           // injected builders for `dynamic` and `Never` which do not have
           // corresponding classes in the AST.
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 a5fac56..6f25365 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -85,7 +85,7 @@
 import '../source/source_factory_builder.dart';
 import '../source/source_field_builder.dart';
 import '../source/source_function_builder.dart';
-import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+import '../source/source_library_builder.dart';
 import '../source/source_procedure_builder.dart';
 import '../source/stack_listener_impl.dart'
     show StackListenerImpl, offsetForToken;
@@ -1010,7 +1010,8 @@
       // `invalid-type`.
       TypeBuilder? type = pop() as TypeBuilder?;
       if (type != null) {
-        buildDartType(type, allowPotentiallyConstantType: false);
+        buildDartType(type, TypeUse.fieldType,
+            allowPotentiallyConstantType: false);
       }
     }
     pop(); // Annotations.
@@ -1030,7 +1031,7 @@
     _unaliasTypeAliasedConstructorInvocations();
     _unaliasTypeAliasedFactoryInvocations(typeAliasedFactoryInvocations);
     _resolveRedirectingFactoryTargets(redirectingFactoryInvocations);
-    libraryBuilder.checkUncheckedTypedefTypes(typeEnvironment);
+    libraryBuilder.checkPendingBoundsChecks(typeEnvironment);
     if (hasDelayedActions) {
       assert(
           delayedActionPerformers != null,
@@ -2193,7 +2194,7 @@
       assert(forest.argumentsTypeArguments(arguments).isEmpty);
       forest.argumentsSetTypeArguments(
           arguments,
-          buildDartTypeArguments(typeArguments,
+          buildDartTypeArguments(typeArguments, TypeUse.invocationTypeArgument,
               allowPotentiallyConstantType: false));
     } else {
       assert(typeArguments == null ||
@@ -3280,8 +3281,6 @@
       ..fileOffset = identifier.charOffset
       ..fileEqualsOffset = offsetForToken(equalsToken);
     typeInferrer.assignedVariables.declare(variable);
-    libraryBuilder.checkBoundsInVariableDeclaration(
-        variable, typeEnvironment, uri);
     push(variable);
   }
 
@@ -3363,7 +3362,8 @@
     }
     TypeBuilder? unresolvedType = pop(NullValue.TypeBuilder) as TypeBuilder?;
     DartType? type = unresolvedType != null
-        ? buildDartType(unresolvedType, allowPotentiallyConstantType: false)
+        ? buildDartType(unresolvedType, TypeUse.variableType,
+            allowPotentiallyConstantType: false)
         : null;
     int modifiers = (lateToken != null ? lateMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
@@ -3805,7 +3805,8 @@
             lengthOfSpan(leftBracket, leftBracket.endGroup));
         typeArgument = const InvalidType();
       } else {
-        typeArgument = buildDartType(typeArguments.single,
+        typeArgument = buildDartType(
+            typeArguments.single, TypeUse.literalTypeArgument,
             allowPotentiallyConstantType: false);
         typeArgument = instantiateToBounds(
             typeArgument, coreTypes.objectClass, libraryBuilder.library);
@@ -3822,7 +3823,6 @@
         expressions,
         isConst: constKeyword != null ||
             constantContext == ConstantContext.inferred);
-    libraryBuilder.checkBoundsInListLiteral(node, typeEnvironment, uri);
     push(node);
   }
 
@@ -3830,7 +3830,8 @@
       Token leftBrace, List<dynamic>? setOrMapEntries) {
     DartType typeArgument;
     if (typeArguments != null) {
-      typeArgument = buildDartType(typeArguments.single,
+      typeArgument = buildDartType(
+          typeArguments.single, TypeUse.literalTypeArgument,
           allowPotentiallyConstantType: false);
       typeArgument = instantiateToBounds(
           typeArgument, coreTypes.objectClass, libraryBuilder.library);
@@ -3861,7 +3862,6 @@
         expressions,
         isConst: constKeyword != null ||
             constantContext == ConstantContext.inferred);
-    libraryBuilder.checkBoundsInSetLiteral(node, typeEnvironment, uri);
     push(node);
   }
 
@@ -3971,9 +3971,9 @@
         keyType = const InvalidType();
         valueType = const InvalidType();
       } else {
-        keyType = buildDartType(typeArguments[0],
+        keyType = buildDartType(typeArguments[0], TypeUse.literalTypeArgument,
             allowPotentiallyConstantType: false);
-        valueType = buildDartType(typeArguments[1],
+        valueType = buildDartType(typeArguments[1], TypeUse.literalTypeArgument,
             allowPotentiallyConstantType: false);
         keyType = instantiateToBounds(
             keyType, coreTypes.objectClass, libraryBuilder.library);
@@ -3995,7 +3995,6 @@
         entries,
         isConst: constKeyword != null ||
             constantContext == ConstantContext.inferred);
-    libraryBuilder.checkBoundsInMapLiteral(node, typeEnvironment, uri);
     push(node);
   }
 
@@ -4222,10 +4221,8 @@
   @override
   void handleAsOperator(Token operator) {
     debugEvent("AsOperator");
-    DartType type = buildDartType(pop() as TypeBuilder,
+    DartType type = buildDartType(pop() as TypeBuilder, TypeUse.asType,
         allowPotentiallyConstantType: libraryBuilder.isNonNullableByDefault);
-    libraryBuilder.checkBoundsInType(
-        type, typeEnvironment, uri, operator.charOffset);
     Expression expression = popForValue();
     Expression asExpression = forest.createAsExpression(
         offsetForToken(operator), expression, type,
@@ -4246,15 +4243,13 @@
   @override
   void handleIsOperator(Token isOperator, Token? not) {
     debugEvent("IsOperator");
-    DartType type = buildDartType(pop() as TypeBuilder,
+    DartType type = buildDartType(pop() as TypeBuilder, TypeUse.isType,
         allowPotentiallyConstantType: libraryBuilder.isNonNullableByDefault);
     Expression operand = popForValue();
     Expression isExpression = forest.createIsExpression(
         offsetForToken(isOperator), operand, type,
         forNonNullableByDefault: libraryBuilder.isNonNullableByDefault,
         notFileOffset: not != null ? offsetForToken(not) : null);
-    libraryBuilder.checkBoundsInType(
-        type, typeEnvironment, uri, isOperator.charOffset);
     push(isExpression);
   }
 
@@ -4351,16 +4346,6 @@
     }
     Object? nameNode = pop();
     TypeBuilder? type = pop() as TypeBuilder?;
-    if (functionNestingLevel == 0 && type != null) {
-      // TODO(ahe): The type we compute here may be different from what is
-      // computed in the outline phase. We should make sure that the outline
-      // phase computes the same type. See
-      // pkg/front_end/testcases/deferred_type_annotation.dart for an example
-      // where not calling [buildDartType] leads to a missing compile-time
-      // error. Also, notice that the type of the problematic parameter isn't
-      // `invalid-type`.
-      buildDartType(type, allowPotentiallyConstantType: false);
-    }
     Token? varOrFinalOrConst = pop(NullValue.Token) as Token?;
     if (superKeyword != null &&
         varOrFinalOrConst != null &&
@@ -4569,7 +4554,7 @@
         popIfNotNull(onKeyword) as TypeBuilder?;
     DartType exceptionType;
     if (unresolvedExceptionType != null) {
-      exceptionType = buildDartType(unresolvedExceptionType,
+      exceptionType = buildDartType(unresolvedExceptionType, TypeUse.catchType,
           allowPotentiallyConstantType: false);
     } else {
       exceptionType = (libraryBuilder.isNonNullableByDefault
@@ -5285,7 +5270,7 @@
         receiver = forest.createInstantiation(
             instantiationOffset,
             receiver,
-            buildDartTypeArguments(typeArguments,
+            buildDartTypeArguments(typeArguments, TypeUse.tearOffTypeArgument,
                 allowPotentiallyConstantType: true));
       }
       return forest.createMethodInvocation(invocationOffset, receiver,
@@ -5295,7 +5280,8 @@
         assert(forest.argumentsTypeArguments(arguments).isEmpty);
         forest.argumentsSetTypeArguments(
             arguments,
-            buildDartTypeArguments(typeArguments,
+            buildDartTypeArguments(
+                typeArguments, TypeUse.constructorTypeArgument,
                 allowPotentiallyConstantType: false));
       }
       return buildUnresolvedError(
@@ -5437,7 +5423,8 @@
             }
             List<DartType> dartTypeArguments = [];
             for (TypeBuilder typeBuilder in unaliasedTypeArgumentBuilders) {
-              dartTypeArguments.add(typeBuilder.build(libraryBuilder));
+              dartTypeArguments.add(typeBuilder.build(
+                  libraryBuilder, TypeUse.constructorTypeArgument));
             }
             assert(forest.argumentsTypeArguments(arguments).isEmpty);
             forest.argumentsSetTypeArguments(arguments, dartTypeArguments);
@@ -5452,8 +5439,8 @@
             typeArgumentBuilders.length, const DynamicType(),
             growable: false);
         for (int i = 0; i < typeArgumentsToCheck.length; ++i) {
-          typeArgumentsToCheck[i] =
-              typeArgumentBuilders[i].build(libraryBuilder);
+          typeArgumentsToCheck[i] = typeArgumentBuilders[i]
+              .build(libraryBuilder, TypeUse.constructorTypeArgument);
         }
       }
       DartType typeToCheck = new TypedefType(
@@ -5491,7 +5478,8 @@
           }
           List<DartType> dartTypeArguments = [];
           for (TypeBuilder typeBuilder in unaliasedTypeArgumentBuilders) {
-            dartTypeArguments.add(typeBuilder.build(libraryBuilder));
+            dartTypeArguments.add(typeBuilder.build(
+                libraryBuilder, TypeUse.constructorTypeArgument));
           }
           assert(forest.argumentsTypeArguments(arguments).isEmpty);
           forest.argumentsSetTypeArguments(arguments, dartTypeArguments);
@@ -5505,8 +5493,8 @@
               // No type arguments provided to unaliased class, use defaults.
               List<DartType> result = new List<DartType>.generate(
                   cls.typeVariables!.length,
-                  (int i) => cls.typeVariables![i].defaultType!
-                      .build(cls.libraryBuilder),
+                  (int i) => cls.typeVariables![i].defaultType!.build(
+                      cls.libraryBuilder, TypeUse.constructorTypeArgument),
                   growable: true);
               forest.argumentsSetTypeArguments(arguments, result);
             }
@@ -5518,7 +5506,8 @@
         assert(forest.argumentsTypeArguments(arguments).isEmpty);
         forest.argumentsSetTypeArguments(
             arguments,
-            buildDartTypeArguments(typeArguments,
+            buildDartTypeArguments(
+                typeArguments, TypeUse.constructorTypeArgument,
                 allowPotentiallyConstantType: false));
       }
     }
@@ -7195,7 +7184,7 @@
       } else {
         push(new Instantiation(
             toValue(operand),
-            buildDartTypeArguments(typeArguments,
+            buildDartTypeArguments(typeArguments, TypeUse.tearOffTypeArgument,
                 allowPotentiallyConstantType: true))
           ..fileOffset = openAngleBracket.charOffset);
       }
@@ -7425,20 +7414,28 @@
   }
 
   @override
-  DartType buildDartType(TypeBuilder typeBuilder,
+  DartType buildDartType(TypeBuilder typeBuilder, TypeUse typeUse,
       {required bool allowPotentiallyConstantType}) {
     return validateTypeVariableUse(typeBuilder,
             allowPotentiallyConstantType: allowPotentiallyConstantType)
-        .build(libraryBuilder);
+        .build(libraryBuilder, typeUse);
+  }
+
+  DartType buildAliasedDartType(TypeBuilder typeBuilder, TypeUse typeUse,
+      {required bool allowPotentiallyConstantType}) {
+    return validateTypeVariableUse(typeBuilder,
+            allowPotentiallyConstantType: allowPotentiallyConstantType)
+        .buildAliased(libraryBuilder, typeUse);
   }
 
   @override
-  List<DartType> buildDartTypeArguments(List<TypeBuilder>? unresolvedTypes,
+  List<DartType> buildDartTypeArguments(
+      List<TypeBuilder>? unresolvedTypes, TypeUse typeUse,
       {required bool allowPotentiallyConstantType}) {
     if (unresolvedTypes == null) return <DartType>[];
     return new List<DartType>.generate(
         unresolvedTypes.length,
-        (int i) => buildDartType(unresolvedTypes[i],
+        (int i) => buildDartType(unresolvedTypes[i], typeUse,
             allowPotentiallyConstantType: allowPotentiallyConstantType),
         growable: true);
   }
@@ -7652,9 +7649,12 @@
       AsyncMarker asyncModifier,
       Statement body,
       int fileEndOffset) {
+    // TODO(johnniwinther): Avoid creating a FunctionTypeBuilder to create
+    // the function. The function type is not written as a type by the user
+    // and shouldn't be checked as such.
     FunctionType type = toFunctionType(
             returnType, const NullabilityBuilder.omitted(), typeParameters)
-        .build(library) as FunctionType;
+        .build(library, TypeUse.functionSignature) as FunctionType;
     List<VariableDeclaration> positionalParameters = <VariableDeclaration>[];
     List<VariableDeclaration> namedParameters = <VariableDeclaration>[];
     if (parameters != null) {
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 927fca16..4d0d98c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -11,6 +11,7 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
 
 import 'package:kernel/ast.dart';
+import 'package:kernel/src/unaliasing.dart';
 import 'package:kernel/text/ast_to_text.dart';
 import 'package:kernel/type_algebra.dart';
 
@@ -56,7 +57,6 @@
 
 import '../scope.dart';
 
-import '../source/source_library_builder.dart';
 import '../source/stack_listener_impl.dart' show offsetForToken;
 
 import 'body_builder.dart' show noLocation;
@@ -261,7 +261,8 @@
       int fileOffset, List<TypeBuilder>? typeArguments) {
     return new Instantiation(
         buildSimpleRead(),
-        _helper.buildDartTypeArguments(typeArguments,
+        _helper.buildDartTypeArguments(
+            typeArguments, TypeUse.tearOffTypeArgument,
             allowPotentiallyConstantType: true))
       ..fileOffset = fileOffset;
   }
@@ -2920,7 +2921,7 @@
       int charOffset = offsetForToken(prefixGenerator.token);
       message = templateDeferredTypeAnnotation
           .withArguments(
-              _helper.buildDartType(type,
+              _helper.buildDartType(type, TypeUse.deferredTypeError,
                   allowPotentiallyConstantType: allowPotentiallyConstantType),
               prefixGenerator._plainNameForRead,
               _helper.libraryBuilder.isNonNullableByDefault)
@@ -3084,6 +3085,7 @@
                 buildTypeWithResolvedArguments(
                     _helper.libraryBuilder.nonNullableBuilder, typeArguments,
                     allowPotentiallyConstantType: true, forTypeLiteral: true),
+                TypeUse.typeLiteral,
                 allowPotentiallyConstantType:
                     _helper.libraryFeatures.constructorTearoffs.isEnabled));
       }
@@ -3127,14 +3129,15 @@
       } else {
         if (declarationBuilder is DeclarationBuilder) {
           if (aliasedTypeArguments != null) {
-            _helper.libraryBuilder.uncheckedTypedefTypes.add(
-                new UncheckedTypedefType(new TypedefType(
-                    aliasBuilder.typedef,
-                    _helper.libraryBuilder.nonNullable,
-                    aliasBuilder.buildTypeArguments(
-                        _helper.libraryBuilder, aliasedTypeArguments)))
-                  ..fileUri = _uri
-                  ..offset = fileOffset);
+            new NamedTypeBuilder(
+                aliasBuilder.name, const NullabilityBuilder.omitted(),
+                arguments: aliasedTypeArguments,
+                fileUri: _uri,
+                charOffset: fileOffset,
+                instanceTypeVariableAccess:
+                    _helper.instanceTypeVariableAccessState)
+              ..bind(_helper.libraryBuilder, aliasBuilder)
+              ..build(_helper.libraryBuilder, TypeUse.instantiation);
           }
 
           // If the arguments weren't supplied, the tear off is treated as
@@ -3225,12 +3228,15 @@
                     builtTypeArguments.add(typeParameter.defaultType);
                   }
                 } else {
-                  builtTypeArguments = declarationBuilder.buildTypeArguments(
-                      _helper.libraryBuilder, unaliasedTypeArguments);
+                  builtTypeArguments = unaliasTypes(
+                      declarationBuilder.buildAliasedTypeArguments(
+                          _helper.libraryBuilder, unaliasedTypeArguments),
+                      legacyEraseAliases:
+                          !_helper.libraryBuilder.isNonNullableByDefault)!;
                 }
               } else if (typeArguments != null) {
                 builtTypeArguments = _helper.buildDartTypeArguments(
-                    typeArguments,
+                    typeArguments, TypeUse.tearOffTypeArgument,
                     allowPotentiallyConstantType: true);
               }
               if (isGenericTypedefTearOff) {
@@ -3262,6 +3268,10 @@
                         .add(freshTypeParameters.substitute(builtTypeArgument));
                   }
                 }
+                substitutedTypeArguments = unaliasTypes(
+                    substitutedTypeArguments,
+                    legacyEraseAliases:
+                        !_helper.libraryBuilder.isNonNullableByDefault);
 
                 tearOffExpression = _helper.forest.createTypedefTearOff(
                     token.charOffset,
@@ -3271,6 +3281,10 @@
               } else {
                 if (builtTypeArguments != null &&
                     builtTypeArguments.isNotEmpty) {
+                  builtTypeArguments = unaliasTypes(builtTypeArguments,
+                      legacyEraseAliases:
+                          !_helper.libraryBuilder.isNonNullableByDefault)!;
+
                   tearOffExpression = _helper.forest.createInstantiation(
                       token.charOffset, tearOffExpression, builtTypeArguments);
                 }
@@ -3672,7 +3686,8 @@
       assert(_forest.argumentsTypeArguments(arguments).isEmpty);
       _forest.argumentsSetTypeArguments(
           arguments,
-          _helper.buildDartTypeArguments(typeArguments,
+          _helper.buildDartTypeArguments(
+              typeArguments, TypeUse.constructorTypeArgument,
               allowPotentiallyConstantType: false));
     }
     return buildError(arguments, kind: UnresolvedKind.Constructor);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 41ab864..b10a3ff 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -150,10 +150,11 @@
   Expression evaluateArgumentsBefore(
       Arguments arguments, Expression expression);
 
-  DartType buildDartType(TypeBuilder typeBuilder,
+  DartType buildDartType(TypeBuilder typeBuilder, TypeUse typeUse,
       {required bool allowPotentiallyConstantType});
 
-  List<DartType> buildDartTypeArguments(List<TypeBuilder>? typeArguments,
+  List<DartType> buildDartTypeArguments(
+      List<TypeBuilder>? typeArguments, TypeUse typeUse,
       {required bool allowPotentiallyConstantType});
 
   void reportDuplicatedDeclaration(
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 6debbc9..dd68ba0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -18,7 +18,7 @@
 import '../fasta_codes.dart';
 import '../names.dart';
 import '../problems.dart' show unhandled;
-import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+import '../source/source_library_builder.dart';
 import '../type_inference/type_constraint_gatherer.dart';
 import '../type_inference/type_inference_engine.dart';
 import '../type_inference/type_inferrer.dart';
@@ -274,8 +274,7 @@
         resultType.returnType, resultType.declaredNullability,
         namedParameters: resultType.namedParameters,
         typeParameters: freshTypeParameters.freshTypeParameters,
-        requiredParameterCount: resultType.requiredParameterCount,
-        typedefType: null);
+        requiredParameterCount: resultType.requiredParameterCount);
     ExpressionInferenceResult inferredResult =
         inferrer.instantiateTearOff(resultType, typeContext, node);
     return inferrer.ensureAssignableResult(typeContext, inferredResult);
@@ -1397,8 +1396,6 @@
       inferrer.dataForTesting!.typeInferenceResult.inferredVariableTypes[node] =
           inferredType.returnType;
     }
-    inferrer.libraryBuilder.checkBoundsInFunctionNode(node.function,
-        inferrer.typeSchemaEnvironment, inferrer.libraryBuilder.fileUri);
     node.variable.type = inferredType;
     inferrer.flowAnalysis.functionExpression_end();
     return const StatementInferenceResult();
@@ -1414,11 +1411,6 @@
       inferrer.dataForTesting!.typeInferenceResult.inferredVariableTypes[node] =
           inferredType.returnType;
     }
-    // In anonymous functions the return type isn't declared, so
-    // it shouldn't be checked.
-    inferrer.libraryBuilder.checkBoundsInFunctionNode(node.function,
-        inferrer.typeSchemaEnvironment, inferrer.libraryBuilder.fileUri,
-        skipReturnType: true);
     inferrer.flowAnalysis.functionExpression_end();
     return new ExpressionInferenceResult(inferredType, node);
   }
@@ -2088,9 +2080,10 @@
     if (!inferrer.isTopLevel) {
       SourceLibraryBuilder library = inferrer.libraryBuilder;
       if (inferenceNeeded) {
-        library.checkBoundsInListLiteral(
-            node, inferrer.typeSchemaEnvironment, inferrer.helper!.uri,
-            inferred: true);
+        if (!library.libraryFeatures.genericMetadata.isEnabled) {
+          inferrer.checkGenericFunctionTypeArgument(
+              node.typeArgument, node.fileOffset);
+        }
       }
     }
 
@@ -2885,9 +2878,12 @@
       // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
       // none of them, so we may just check one.
       if (inferenceNeeded) {
-        library.checkBoundsInMapLiteral(
-            node, inferrer.typeSchemaEnvironment, inferrer.helper!.uri,
-            inferred: true);
+        if (!library.libraryFeatures.genericMetadata.isEnabled) {
+          inferrer.checkGenericFunctionTypeArgument(
+              node.keyType, node.fileOffset);
+          inferrer.checkGenericFunctionTypeArgument(
+              node.valueType, node.fileOffset);
+        }
       }
     }
     return new ExpressionInferenceResult(inferredType, node);
@@ -6032,9 +6028,10 @@
     if (!inferrer.isTopLevel) {
       SourceLibraryBuilder library = inferrer.libraryBuilder;
       if (inferenceNeeded) {
-        library.checkBoundsInSetLiteral(
-            node, inferrer.typeSchemaEnvironment, inferrer.helper!.uri,
-            inferred: true);
+        if (!library.libraryFeatures.genericMetadata.isEnabled) {
+          inferrer.checkGenericFunctionTypeArgument(
+              node.typeArgument, node.fileOffset);
+        }
       }
 
       if (!library.loader.target.backendTarget.supportsSetLiterals) {
@@ -6453,13 +6450,6 @@
       TypeLiteral node, DartType typeContext) {
     DartType inferredType =
         inferrer.coreTypes.typeRawType(inferrer.libraryBuilder.nonNullable);
-    if (inferrer.libraryFeatures.constructorTearoffs.isEnabled) {
-      inferrer.libraryBuilder.checkBoundsInType(
-          node.type,
-          inferrer.typeSchemaEnvironment,
-          inferrer.libraryBuilder.fileUri,
-          node.fileOffset);
-    }
     return new ExpressionInferenceResult(inferredType, node);
   }
 
@@ -6592,14 +6582,6 @@
       Expression initializer = initializerResult.expression;
       node.initializer = initializer..parent = node;
     }
-    if (!inferrer.isTopLevel) {
-      SourceLibraryBuilder library = inferrer.libraryBuilder;
-      if (node.isImplicitlyTyped) {
-        library.checkBoundsInVariableDeclaration(
-            node, inferrer.typeSchemaEnvironment, inferrer.helper!.uri,
-            inferred: true);
-      }
-    }
     if (node.isLate &&
         inferrer.libraryBuilder.loader.target.backendTarget
             .isLateLocalLoweringEnabled(
diff --git a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
index 0d49a4e..c2759d1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
@@ -89,9 +89,6 @@
     for (NamedType parameter in node.namedParameters) {
       if (parameter.type.accept1(this, visitedTypedefs)) return true;
     }
-    if (node.typedefType != null && visitedTypedefs.add(node.typedefType!)) {
-      if (node.typedefType!.accept1(this, visitedTypedefs)) return true;
-    }
     return false;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
index 1ecd8aa..75daa98 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
@@ -16,6 +16,7 @@
 import '../../builder/type_alias_builder.dart';
 import '../../builder/type_builder.dart';
 import '../../builder/type_declaration_builder.dart';
+import '../../uris.dart';
 import 'macro.dart';
 
 abstract class IdentifierImpl extends macro.IdentifierImpl {
@@ -41,7 +42,7 @@
       } else if (typeDeclarationBuilder is TypeAliasBuilder) {
         uri = typeDeclarationBuilder.libraryBuilder.importUri;
       } else if (name == 'dynamic') {
-        uri = Uri.parse('dart:core');
+        uri = dartCore;
       }
       return new macro.ResolvedIdentifier(
           kind: macro.IdentifierKind.topLevelMember,
@@ -88,8 +89,16 @@
   @override
   DartType buildType(
       NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
-    return typeBuilder.declaration!.buildTypeWithBuiltArguments(libraryBuilder,
-        nullabilityBuilder.build(libraryBuilder), typeArguments);
+    return typeBuilder.declaration!.buildAliasedTypeWithBuiltArguments(
+        libraryBuilder,
+        nullabilityBuilder.build(libraryBuilder),
+        typeArguments,
+        TypeUse.macroTypeArgument,
+        // TODO(johnniwinther): How should handle malbounded types here? Should
+        // we report an error on the annotation?
+        missingUri,
+        TreeNode.noOffset,
+        hasExplicitTypeArguments: true);
   }
 
   @override
@@ -124,8 +133,16 @@
   @override
   DartType buildType(
       NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
-    return typeDeclarationBuilder.buildTypeWithBuiltArguments(libraryBuilder,
-        nullabilityBuilder.build(libraryBuilder), typeArguments);
+    return typeDeclarationBuilder.buildAliasedTypeWithBuiltArguments(
+        libraryBuilder,
+        nullabilityBuilder.build(libraryBuilder),
+        typeArguments,
+        TypeUse.macroTypeArgument,
+        // TODO(johnniwinther): How should handle malbounded types here? Should
+        // we report an error on the annotation?
+        missingUri,
+        TreeNode.noOffset,
+        hasExplicitTypeArguments: true);
   }
 }
 
@@ -219,7 +236,7 @@
         kind: macro.IdentifierKind.topLevelMember,
         name: name,
         staticScope: null,
-        uri: Uri.parse('dart:core'));
+        uri: dartCore);
   }
 
   @override
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 fda68ec..9039e6a 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
@@ -56,7 +56,7 @@
 import 'source_constructor_builder.dart';
 import 'source_factory_builder.dart';
 import 'source_field_builder.dart';
-import 'source_library_builder.dart' show SourceLibraryBuilder;
+import 'source_library_builder.dart';
 import 'source_member_builder.dart';
 
 Class initializeClass(
@@ -523,15 +523,22 @@
   int get typeVariablesCount => typeVariables?.length ?? 0;
 
   @override
-  List<DartType> buildTypeArguments(
+  List<DartType> buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments) {
     if (arguments == null && typeVariables == null) {
       return <DartType>[];
     }
 
     if (arguments == null && typeVariables != null) {
-      List<DartType> result = new List<DartType>.generate(typeVariables!.length,
-          (int i) => typeVariables![i].defaultType!.build(library),
+      // TODO(johnniwinther): Use i2b here when needed.
+      List<DartType> result = new List<DartType>.generate(
+          typeVariables!.length,
+          (int i) => typeVariables![i]
+              .defaultType!
+              // TODO(johnniwinther): Using [libraryBuilder] here instead of
+              // [library] preserves the nullability of the original
+              // declaration. Should we legacy erase this?
+              .buildAliased(libraryBuilder, TypeUse.defaultTypeAsTypeArgument),
           growable: true);
       if (library is SourceLibraryBuilder) {
         library.inferredTypes.addAll(result);
@@ -551,8 +558,8 @@
     }
 
     assert(arguments!.length == typeVariablesCount);
-    List<DartType> result = new List<DartType>.generate(
-        arguments!.length, (int i) => arguments[i].build(library),
+    List<DartType> result = new List<DartType>.generate(arguments!.length,
+        (int i) => arguments[i].buildAliased(library, TypeUse.typeArgument),
         growable: true);
     return result;
   }
@@ -1321,99 +1328,7 @@
     }
   }
 
-  void checkBoundsInSupertype(
-      Supertype supertype, TypeEnvironment typeEnvironment) {
-    Library library = libraryBuilder.library;
-
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        new InterfaceType(
-            supertype.classNode, library.nonNullable, supertype.typeArguments),
-        typeEnvironment,
-        libraryBuilder.isNonNullableByDefault
-            ? SubtypeCheckMode.withNullabilities
-            : SubtypeCheckMode.ignoringNullabilities,
-        allowSuperBounded: false,
-        isNonNullableByDefault: library.isNonNullableByDefault,
-        areGenericArgumentsAllowed:
-            libraryBuilder.libraryFeatures.genericMetadata.isEnabled);
-    for (TypeArgumentIssue issue in issues) {
-      DartType argument = issue.argument;
-      TypeParameter typeParameter = issue.typeParameter;
-      bool inferred = libraryBuilder.inferredTypes.contains(argument);
-      if (issue.isGenericTypeAsArgumentIssue) {
-        if (inferred) {
-          // Supertype can't be or contain super-bounded types, so null is
-          // passed for super-bounded hint here.
-          libraryBuilder.reportTypeArgumentIssue(
-              templateGenericFunctionTypeInferredAsActualTypeArgument
-                  .withArguments(argument, library.isNonNullableByDefault),
-              fileUri,
-              charOffset,
-              typeParameter: null,
-              superBoundedAttempt: null,
-              superBoundedAttemptInverted: null);
-        } else {
-          // Supertype can't be or contain super-bounded types, so null is
-          // passed for super-bounded hint here.
-          libraryBuilder.reportTypeArgumentIssue(
-              messageGenericFunctionTypeUsedAsActualTypeArgument,
-              fileUri,
-              charOffset,
-              typeParameter: null,
-              superBoundedAttempt: null,
-              superBoundedAttemptInverted: null);
-        }
-      } else {
-        void reportProblem(
-            Template<
-                    Message Function(DartType, DartType, String, String, String,
-                        String, bool)>
-                template) {
-          // Supertype can't be or contain super-bounded types, so null is
-          // passed for super-bounded hint here.
-          libraryBuilder.reportTypeArgumentIssue(
-              template.withArguments(
-                  argument,
-                  typeParameter.bound,
-                  typeParameter.name!,
-                  getGenericTypeName(issue.enclosingType!),
-                  supertype.classNode.name,
-                  name,
-                  library.isNonNullableByDefault),
-              fileUri,
-              charOffset,
-              typeParameter: typeParameter,
-              superBoundedAttempt: null,
-              superBoundedAttemptInverted: null);
-        }
-
-        if (inferred) {
-          reportProblem(templateIncorrectTypeArgumentInSupertypeInferred);
-        } else {
-          reportProblem(templateIncorrectTypeArgumentInSupertype);
-        }
-      }
-    }
-  }
-
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
-    libraryBuilder.checkBoundsInTypeParameters(
-        typeEnvironment, cls.typeParameters, fileUri);
-
-    // Check in supers.
-    if (cls.supertype != null) {
-      checkBoundsInSupertype(cls.supertype!, typeEnvironment);
-    }
-    if (cls.mixedInType != null) {
-      checkBoundsInSupertype(cls.mixedInType!, typeEnvironment);
-    }
-    // ignore: unnecessary_null_comparison
-    if (cls.implementedTypes != null) {
-      for (Supertype supertype in cls.implementedTypes) {
-        checkBoundsInSupertype(supertype, typeEnvironment);
-      }
-    }
-
     forEach((String name, Builder builder) {
       if (builder is SourceMemberBuilder) {
         builder.checkVariance(this, typeEnvironment);
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 10a8838..f2812d0 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
@@ -179,7 +179,9 @@
     List<SourceFieldBuilder> elementBuilders = <SourceFieldBuilder>[];
     NamedTypeBuilder selfType = new NamedTypeBuilder(
         name, const NullabilityBuilder.omitted(),
-        instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
+        instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected,
+        fileUri: fileUri,
+        charOffset: charOffset);
     NamedTypeBuilder listType = new NamedTypeBuilder(
         "List", const NullabilityBuilder.omitted(),
         arguments: <TypeBuilder>[selfType],
@@ -628,7 +630,8 @@
   }
 
   DartType buildElement(SourceFieldBuilder fieldBuilder, CoreTypes coreTypes) {
-    DartType selfType = this.selfType.build(libraryBuilder);
+    DartType selfType =
+        this.selfType.build(libraryBuilder, TypeUse.enumSelfType);
     Builder? builder = firstMemberNamed(fieldBuilder.name);
     if (builder == null || !builder.isField) return selfType;
     fieldBuilder = builder as SourceFieldBuilder;
@@ -674,7 +677,8 @@
     if (typeArgumentBuilders != null) {
       typeArguments = <DartType>[];
       for (TypeBuilder typeBuilder in typeArgumentBuilders) {
-        typeArguments.add(typeBuilder.build(libraryBuilder));
+        typeArguments.add(
+            typeBuilder.build(libraryBuilder, TypeUse.constructorTypeArgument));
       }
     }
     if (libraryBuilder.libraryFeatures.enhancedEnums.isEnabled) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 740f9b8..578747e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -91,7 +91,7 @@
   /// library.
   Extension build(LibraryBuilder coreLibrary,
       {required bool addMembersToLibrary}) {
-    _extension.onType = onType.build(libraryBuilder);
+    _extension.onType = onType.build(libraryBuilder, TypeUse.extensionOnType);
     extensionTypeShowHideClauseBuilder.buildAndStoreTypes(
         _extension, libraryBuilder);
 
@@ -242,16 +242,6 @@
   }
 
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
-    libraryBuilder.checkBoundsInTypeParameters(
-        typeEnvironment, extension.typeParameters, fileUri);
-
-    // Check on clause.
-    // ignore: unnecessary_null_comparison
-    if (_extension.onType != null) {
-      libraryBuilder.checkBoundsInType(_extension.onType, typeEnvironment,
-          onType.fileUri!, onType.charOffset!);
-    }
-
     forEach((String name, Builder builder) {
       if (builder is SourceFieldBuilder) {
         // Check fields.
diff --git a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
index 09523b6..7ba09c8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
@@ -360,7 +360,8 @@
     if (redirectionTarget.typeArguments != null) {
       typeArguments = new List<DartType>.generate(
           redirectionTarget.typeArguments!.length,
-          (int i) => redirectionTarget.typeArguments![i].build(libraryBuilder),
+          (int i) => redirectionTarget.typeArguments![i]
+              .build(libraryBuilder, TypeUse.redirectionTypeArgument),
           growable: false);
     }
     updatePrivateMemberName(_procedureInternal, libraryBuilder);
diff --git a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
index e5d89e8..cdf803a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart
@@ -367,7 +367,7 @@
   /// Builds the core AST structures for this field as needed for the outline.
   void build() {
     if (type != null) {
-      fieldType = type!.build(libraryBuilder);
+      fieldType = type!.build(libraryBuilder, TypeUse.fieldType);
     }
     _fieldEncoding.build(libraryBuilder, this);
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
index 1411267..e52c631 100644
--- a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart
@@ -387,7 +387,8 @@
       function.requiredParameterCount = 1;
     }
     if (returnType != null) {
-      function.returnType = returnType!.build(libraryBuilder);
+      function.returnType =
+          returnType!.build(libraryBuilder, TypeUse.returnType);
     }
     if (isExtensionInstanceMember) {
       ExtensionBuilder extensionBuilder = parent as ExtensionBuilder;
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 53fa58e..963b623 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
@@ -21,7 +21,8 @@
         TypeArgumentIssue,
         findTypeArgumentIssues,
         findTypeArgumentIssuesForInvocation,
-        getGenericTypeName;
+        getGenericTypeName,
+        hasGenericFunctionTypeAsTypeArgument;
 import 'package:kernel/type_algebra.dart' show Substitution, substitute;
 import 'package:kernel/type_environment.dart'
     show SubtypeCheckMode, TypeEnvironment;
@@ -175,8 +176,8 @@
   final List<TypeVariableBuilder> unboundTypeVariables =
       <TypeVariableBuilder>[];
 
-  final List<UncheckedTypedefType> uncheckedTypedefTypes =
-      <UncheckedTypedefType>[];
+  final List<PendingBoundsCheck> _pendingBoundsChecks = [];
+  final List<GenericFunctionTypeCheck> _pendingGenericFunctionTypeChecks = [];
 
   // A list of alternating forwarders and the procedures they were generated
   // for.  Note that it may not include a forwarder-origin pair in cases when
@@ -3953,7 +3954,7 @@
     addToExportScope(name, member);
   }
 
-  void reportTypeArgumentIssues(
+  void _reportTypeArgumentIssues(
       Iterable<TypeArgumentIssue> issues, Uri fileUri, int offset,
       {bool? inferred,
       TypeArgumentsInfo? typeArgumentsInfo,
@@ -4081,11 +4082,6 @@
 
   void checkTypesInField(
       SourceFieldBuilder fieldBuilder, TypeEnvironment typeEnvironment) {
-    // Check the bounds in the field's type.
-    checkBoundsInType(fieldBuilder.fieldType, typeEnvironment,
-        fieldBuilder.fileUri, fieldBuilder.charOffset,
-        allowSuperBounded: true);
-
     // Check that the field has an initializer if its type is potentially
     // non-nullable.
     if (isNonNullableByDefault) {
@@ -4132,133 +4128,8 @@
     }
   }
 
-  void checkBoundsInTypeParameters(TypeEnvironment typeEnvironment,
-      List<TypeParameter> typeParameters, Uri fileUri) {
-    // Check in bounds of own type variables.
-    for (TypeParameter parameter in typeParameters) {
-      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-          parameter.bound,
-          typeEnvironment,
-          isNonNullableByDefault
-              ? SubtypeCheckMode.withNullabilities
-              : SubtypeCheckMode.ignoringNullabilities,
-          allowSuperBounded: true,
-          isNonNullableByDefault: library.isNonNullableByDefault,
-          areGenericArgumentsAllowed:
-              libraryFeatures.genericMetadata.isEnabled);
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-        if (inferredTypes.contains(argument)) {
-          // Inference in type expressions in the supertypes boils down to
-          // instantiate-to-bound which shouldn't produce anything that breaks
-          // the bounds after the non-simplicity checks are done.  So, any
-          // violation here is the result of non-simple bounds, and the error
-          // is reported elsewhere.
-          continue;
-        }
-
-        if (issue.isGenericTypeAsArgumentIssue) {
-          reportTypeArgumentIssue(
-              messageGenericFunctionTypeUsedAsActualTypeArgument,
-              fileUri,
-              parameter.fileOffset,
-              typeParameter: null);
-        } else {
-          reportTypeArgumentIssue(
-              templateIncorrectTypeArgument.withArguments(
-                  argument,
-                  typeParameter.bound,
-                  typeParameter.name!,
-                  getGenericTypeName(issue.enclosingType!),
-                  library.isNonNullableByDefault),
-              fileUri,
-              parameter.fileOffset,
-              typeParameter: typeParameter,
-              superBoundedAttempt: issue.enclosingType,
-              superBoundedAttemptInverted: issue.invertedType);
-        }
-      }
-    }
-  }
-
-  void checkBoundsInFunctionNodeParts(
-      TypeEnvironment typeEnvironment, Uri fileUri, int fileOffset,
-      {List<TypeParameter>? typeParameters,
-      List<VariableDeclaration>? positionalParameters,
-      List<VariableDeclaration>? namedParameters,
-      DartType? returnType,
-      int? requiredParameterCount,
-      bool skipReturnType = false}) {
-    if (typeParameters != null) {
-      for (TypeParameter parameter in typeParameters) {
-        checkBoundsInType(
-            parameter.bound, typeEnvironment, fileUri, parameter.fileOffset,
-            allowSuperBounded: true);
-      }
-    }
-    if (positionalParameters != null) {
-      for (int i = 0; i < positionalParameters.length; ++i) {
-        VariableDeclaration parameter = positionalParameters[i];
-        checkBoundsInType(
-            parameter.type, typeEnvironment, fileUri, parameter.fileOffset,
-            allowSuperBounded: true);
-      }
-    }
-    if (namedParameters != null) {
-      for (int i = 0; i < namedParameters.length; ++i) {
-        VariableDeclaration named = namedParameters[i];
-        checkBoundsInType(
-            named.type, typeEnvironment, fileUri, named.fileOffset,
-            allowSuperBounded: true);
-      }
-    }
-    if (!skipReturnType && returnType != null) {
-      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-          returnType,
-          typeEnvironment,
-          isNonNullableByDefault
-              ? SubtypeCheckMode.withNullabilities
-              : SubtypeCheckMode.ignoringNullabilities,
-          allowSuperBounded: true,
-          isNonNullableByDefault: library.isNonNullableByDefault,
-          areGenericArgumentsAllowed:
-              libraryFeatures.genericMetadata.isEnabled);
-      for (TypeArgumentIssue issue in issues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-
-        // We don't need to check if [argument] was inferred or specified
-        // here, because inference in return types boils down to instantiate-
-        // -to-bound, and it can't provide a type that violates the bound.
-        if (issue.isGenericTypeAsArgumentIssue) {
-          reportTypeArgumentIssue(
-              messageGenericFunctionTypeUsedAsActualTypeArgument,
-              fileUri,
-              fileOffset,
-              typeParameter: null);
-        } else {
-          reportTypeArgumentIssue(
-              templateIncorrectTypeArgumentInReturnType.withArguments(
-                  argument,
-                  typeParameter.bound,
-                  typeParameter.name!,
-                  getGenericTypeName(issue.enclosingType!),
-                  isNonNullableByDefault),
-              fileUri,
-              fileOffset,
-              typeParameter: typeParameter,
-              superBoundedAttempt: issue.enclosingType,
-              superBoundedAttemptInverted: issue.invertedType);
-        }
-      }
-    }
-  }
-
   void checkTypesInFunctionBuilder(
       SourceFunctionBuilder procedureBuilder, TypeEnvironment typeEnvironment) {
-    checkBoundsInFunctionNode(
-        procedureBuilder.function, typeEnvironment, procedureBuilder.fileUri!);
     if (procedureBuilder.formals != null &&
         !(procedureBuilder.isAbstract || procedureBuilder.isExternal)) {
       checkInitializersInFormals(procedureBuilder.formals!, typeEnvironment);
@@ -4268,8 +4139,6 @@
   void checkTypesInConstructorBuilder(
       DeclaredSourceConstructorBuilder constructorBuilder,
       TypeEnvironment typeEnvironment) {
-    checkBoundsInFunctionNode(
-        constructorBuilder.constructor.function, typeEnvironment, fileUri);
     if (!constructorBuilder.isExternal && constructorBuilder.formals != null) {
       checkInitializersInFormals(constructorBuilder.formals!, typeEnvironment);
     }
@@ -4278,50 +4147,10 @@
   void checkTypesInRedirectingFactoryBuilder(
       RedirectingFactoryBuilder redirectingFactoryBuilder,
       TypeEnvironment typeEnvironment) {
-    checkBoundsInFunctionNode(redirectingFactoryBuilder.function,
-        typeEnvironment, redirectingFactoryBuilder.fileUri);
     // Default values are not required on redirecting factory constructors so
     // we don't call [checkInitializersInFormals].
   }
 
-  void checkBoundsInFunctionNode(
-      FunctionNode function, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool skipReturnType = false}) {
-    checkBoundsInFunctionNodeParts(
-        typeEnvironment, fileUri, function.fileOffset,
-        typeParameters: function.typeParameters,
-        positionalParameters: function.positionalParameters,
-        namedParameters: function.namedParameters,
-        returnType: function.returnType,
-        requiredParameterCount: function.requiredParameterCount,
-        skipReturnType: skipReturnType);
-  }
-
-  void checkBoundsInListLiteral(
-      ListLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    checkBoundsInType(
-        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
-  void checkBoundsInSetLiteral(
-      SetLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    checkBoundsInType(
-        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
-  void checkBoundsInMapLiteral(
-      MapLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    checkBoundsInType(node.keyType, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-    checkBoundsInType(node.valueType, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
   void checkBoundsInType(
       DartType type, TypeEnvironment typeEnvironment, Uri fileUri, int offset,
       {bool? inferred, bool allowSuperBounded = true}) {
@@ -4334,16 +4163,7 @@
         allowSuperBounded: allowSuperBounded,
         isNonNullableByDefault: library.isNonNullableByDefault,
         areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
-    reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
-  }
-
-  void checkBoundsInVariableDeclaration(
-      VariableDeclaration node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    // ignore: unnecessary_null_comparison
-    if (node.type == null) return;
-    checkBoundsInType(node.type, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
+    _reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
   }
 
   void checkBoundsInConstructorInvocation(
@@ -4408,7 +4228,7 @@
             new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
       }
       String targetName = node.target.name.text;
-      reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
+      _reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
           typeArgumentsInfo: typeArgumentsInfo,
           targetReceiver: targetReceiver,
           targetName: targetName);
@@ -4487,7 +4307,7 @@
         bottomType,
         isNonNullableByDefault: library.isNonNullableByDefault,
         areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
-    reportTypeArgumentIssues(issues, fileUri, offset,
+    _reportTypeArgumentIssues(issues, fileUri, offset,
         typeArgumentsInfo: getTypeArgumentsInfo(arguments),
         targetReceiver: receiverType,
         targetName: name.text);
@@ -4520,7 +4340,7 @@
         bottomType,
         isNonNullableByDefault: library.isNonNullableByDefault,
         areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
-    reportTypeArgumentIssues(issues, fileUri, offset,
+    _reportTypeArgumentIssues(issues, fileUri, offset,
         typeArgumentsInfo: getTypeArgumentsInfo(arguments),
         // TODO(johnniwinther): Special-case messaging on function type
         //  invocation to avoid reference to 'call' and use the function type
@@ -4557,7 +4377,7 @@
         bottomType,
         isNonNullableByDefault: library.isNonNullableByDefault,
         areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
-    reportTypeArgumentIssues(issues, fileUri, offset,
+    _reportTypeArgumentIssues(issues, fileUri, offset,
         targetReceiver: functionType,
         typeArgumentsInfo: inferred
             ? const AllInferredTypeArgumentsInfo()
@@ -4592,7 +4412,7 @@
       } else if (declaration is SourceExtensionBuilder) {
         declaration.checkTypesInOutline(typeEnvironment);
       } else if (declaration is SourceTypeAliasBuilder) {
-        declaration.checkTypesInOutline(typeEnvironment);
+        // Do nothing.
       } else {
         assert(
             declaration is! TypeDeclarationBuilder ||
@@ -4601,7 +4421,7 @@
       }
     }
     inferredTypes.clear();
-    checkUncheckedTypedefTypes(typeEnvironment);
+    checkPendingBoundsChecks(typeEnvironment);
   }
 
   void computeShowHideElements(ClassMembersBuilder membersBuilder) {
@@ -4906,19 +4726,113 @@
     return type;
   }
 
-  /// Performs delayed bounds checks on [TypedefType]s for the library
-  ///
-  /// As [TypedefType]s are built, they are eagerly unaliased, making it
-  /// impossible to perform the bounds checks on them at the time when the
-  /// checks can be done. To perform the checks, [TypedefType]s are added to
-  /// [uncheckedTypedefTypes] as they are built.  This method performs the
-  /// checks and clears the list of the types for the delayed check.
-  void checkUncheckedTypedefTypes(TypeEnvironment typeEnvironment) {
-    for (UncheckedTypedefType uncheckedTypedefType in uncheckedTypedefTypes) {
-      checkBoundsInType(uncheckedTypedefType.typeToCheck, typeEnvironment,
-          uncheckedTypedefType.fileUri!, uncheckedTypedefType.offset!);
+  void registerBoundsCheck(
+      DartType type, Uri fileUri, int charOffset, TypeUse typeUse,
+      {required bool inferred}) {
+    _pendingBoundsChecks.add(new PendingBoundsCheck(
+        type, fileUri, charOffset, typeUse,
+        inferred: inferred));
+  }
+
+  void registerGenericFunctionTypeCheck(
+      TypedefType type, Uri fileUri, int charOffset) {
+    _pendingGenericFunctionTypeChecks
+        .add(new GenericFunctionTypeCheck(type, fileUri, charOffset));
+  }
+
+  /// Performs delayed bounds checks.
+  void checkPendingBoundsChecks(TypeEnvironment typeEnvironment) {
+    for (PendingBoundsCheck pendingBoundsCheck in _pendingBoundsChecks) {
+      switch (pendingBoundsCheck.typeUse) {
+        case TypeUse.literalTypeArgument:
+        case TypeUse.variableType:
+        case TypeUse.typeParameterBound:
+        case TypeUse.parameterType:
+        case TypeUse.fieldType:
+        case TypeUse.returnType:
+        case TypeUse.isType:
+        case TypeUse.asType:
+        case TypeUse.catchType:
+        case TypeUse.constructorTypeArgument:
+        case TypeUse.redirectionTypeArgument:
+        case TypeUse.tearOffTypeArgument:
+        case TypeUse.invocationTypeArgument:
+        case TypeUse.typeLiteral:
+        case TypeUse.extensionOnType:
+        case TypeUse.typeArgument:
+          checkBoundsInType(pendingBoundsCheck.type, typeEnvironment,
+              pendingBoundsCheck.fileUri, pendingBoundsCheck.charOffset,
+              inferred: pendingBoundsCheck.inferred, allowSuperBounded: true);
+          break;
+        case TypeUse.typedefAlias:
+        case TypeUse.superType:
+        case TypeUse.mixedInType:
+          checkBoundsInType(pendingBoundsCheck.type, typeEnvironment,
+              pendingBoundsCheck.fileUri, pendingBoundsCheck.charOffset,
+              inferred: pendingBoundsCheck.inferred, allowSuperBounded: false);
+          break;
+        case TypeUse.instantiation:
+          // TODO(johnniwinther): Should we allow super bounded tear offs of
+          // non-proper renames?
+          checkBoundsInType(pendingBoundsCheck.type, typeEnvironment,
+              pendingBoundsCheck.fileUri, pendingBoundsCheck.charOffset,
+              inferred: pendingBoundsCheck.inferred, allowSuperBounded: true);
+          break;
+        case TypeUse.enumSelfType:
+          // TODO(johnniwinther): Check/create this type as regular bounded i2b.
+          /*
+            checkBoundsInType(pendingBoundsCheck.type, typeEnvironment,
+                pendingBoundsCheck.fileUri, pendingBoundsCheck.charOffset,
+                inferred: pendingBoundsCheck.inferred,
+                allowSuperBounded: false);
+          */
+          break;
+        case TypeUse.macroTypeArgument:
+        case TypeUse.typeParameterDefaultType:
+        case TypeUse.defaultTypeAsTypeArgument:
+        case TypeUse.deferredTypeError:
+        case TypeUse.functionSignature:
+          break;
+      }
     }
-    uncheckedTypedefTypes.clear();
+    _pendingBoundsChecks.clear();
+
+    for (GenericFunctionTypeCheck genericFunctionTypeCheck
+        in _pendingGenericFunctionTypeChecks) {
+      checkGenericFunctionTypeAsTypeArgumentThroughTypedef(
+          genericFunctionTypeCheck.type,
+          genericFunctionTypeCheck.fileUri,
+          genericFunctionTypeCheck.charOffset);
+    }
+    _pendingGenericFunctionTypeChecks.clear();
+  }
+
+  /// Reports an error if [type] contains is a generic function type used as
+  /// a type argument through its alias.
+  ///
+  /// For instance
+  ///
+  ///   typedef A = B<void Function<T>(T)>;
+  ///
+  /// here `A` doesn't use a generic function as type argument directly, but
+  /// its unaliased value `B<void Function<T>(T)>` does.
+  ///
+  /// This is used for reporting generic function types used as a type argument,
+  /// which was disallowed before the 'generic-metadata' feature was enabled.
+  void checkGenericFunctionTypeAsTypeArgumentThroughTypedef(
+      TypedefType type, Uri fileUri, int fileOffset) {
+    assert(!libraryFeatures.genericMetadata.isEnabled);
+    if (!hasGenericFunctionTypeAsTypeArgument(type)) {
+      DartType unaliased = type.unalias;
+      if (hasGenericFunctionTypeAsTypeArgument(unaliased)) {
+        addProblem(
+            templateGenericFunctionTypeAsTypeArgumentThroughTypedef
+                .withArguments(unaliased, type, isNonNullableByDefault),
+            fileOffset,
+            noLength,
+            fileUri);
+      }
+    }
   }
 
   void installTypedefTearOffs() {
@@ -5459,11 +5373,21 @@
   }
 }
 
-class UncheckedTypedefType {
-  final TypedefType typeToCheck;
+class PendingBoundsCheck {
+  final DartType type;
+  final Uri fileUri;
+  final int charOffset;
+  final TypeUse typeUse;
+  final bool inferred;
 
-  int? offset;
-  Uri? fileUri;
+  PendingBoundsCheck(this.type, this.fileUri, this.charOffset, this.typeUse,
+      {required this.inferred});
+}
 
-  UncheckedTypedefType(this.typeToCheck);
+class GenericFunctionTypeCheck {
+  final TypedefType type;
+  final Uri fileUri;
+  final int charOffset;
+
+  GenericFunctionTypeCheck(this.type, this.fileUri, this.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 c98f659..cf387f5 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -84,6 +84,7 @@
 import '../type_inference/type_inference_engine.dart';
 import '../type_inference/type_inferrer.dart';
 import '../util/helpers.dart';
+import '../uris.dart';
 import 'diet_listener.dart' show DietListener;
 import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
 import 'name_scheme.dart';
@@ -717,6 +718,8 @@
       List<LocatedMessage>? context,
       bool problemOnLibrary: false,
       List<Uri>? involvedFiles}) {
+    assert(
+        fileUri != missingUri, "Message unexpectedly reported on missing uri.");
     severity ??= message.code.severity;
     if (severity == Severity.ignored) return null;
     String trace = """
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index c24455e..8cf8c31 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -6,7 +6,6 @@
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/type_environment.dart';
 
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
@@ -88,7 +87,7 @@
   }
 
   Typedef build() {
-    typedef.type ??= buildThisType();
+    buildThisType();
 
     TypeBuilder? type = this.type;
     if (type is FunctionTypeBuilder ||
@@ -120,38 +119,29 @@
     // detect cycles by detecting recursive calls to this method using an
     // instance of InvalidType that isn't identical to `const InvalidType()`.
     thisType = pendingTypeAliasMarker;
+    DartType builtType = const InvalidType();
     TypeBuilder? type = this.type;
     // ignore: unnecessary_null_comparison
     if (type != null) {
-      DartType builtType = type.build(libraryBuilder);
-      if (builtType is FunctionType) {
-        // Set the `typedefType` if it hasn't already been set. It can already
-        // be set if this type alias is an alias of another typedef, in which
-        // we use the existing value. For instance
-        //
-        //    typedef void F(); // typedefType will be set to `F`.
-        //    typedef G = F; // The typedefType has already been set to `F`.
-        //
-        builtType.typedefType ??= thisTypedefType(typedef, libraryBuilder);
-      }
+      builtType = type.build(libraryBuilder, TypeUse.typedefAlias);
       // ignore: unnecessary_null_comparison
       if (builtType != null) {
         if (typeVariables != null) {
           for (TypeVariableBuilder tv in typeVariables!) {
             // Follow bound in order to find all cycles
-            tv.bound?.build(libraryBuilder);
+            tv.bound?.build(libraryBuilder, TypeUse.typeParameterBound);
           }
         }
         if (identical(thisType, cyclicTypeAliasMarker)) {
-          return thisType = const InvalidType();
+          builtType = const InvalidType();
         } else {
-          return thisType = builtType;
+          builtType = builtType;
         }
       } else {
-        return thisType = const InvalidType();
+        builtType = const InvalidType();
       }
     }
-    return thisType = const InvalidType();
+    return thisType = typedef.type ??= builtType;
   }
 
   TypedefType thisTypedefType(Typedef typedef, LibraryBuilder clientLibrary) {
@@ -190,15 +180,23 @@
   }
 
   @override
-  List<DartType> buildTypeArguments(
+  List<DartType> buildAliasedTypeArguments(
       LibraryBuilder library, List<TypeBuilder>? arguments) {
     if (arguments == null && typeVariables == null) {
       return <DartType>[];
     }
 
     if (arguments == null && typeVariables != null) {
-      List<DartType> result = new List<DartType>.generate(typeVariables!.length,
-          (int i) => typeVariables![i].defaultType!.build(library),
+      // TODO(johnniwinther): Use i2b here when needed.
+      List<DartType> result = new List<DartType>.generate(
+          typeVariables!.length,
+          (int i) => typeVariables![i]
+              .defaultType!
+              // TODO(johnniwinther): Using [libraryBuilder] here instead of
+              // [library] preserves the nullability of the original
+              // declaration. We legacy erase it later, but should we legacy
+              // erase it now also?
+              .buildAliased(libraryBuilder, TypeUse.defaultTypeAsTypeArgument),
           growable: true);
       if (library is SourceLibraryBuilder) {
         library.inferredTypes.addAll(result);
@@ -218,19 +216,11 @@
     }
 
     // arguments.length == typeVariables.length
-    return new List<DartType>.generate(
-        arguments!.length, (int i) => arguments[i].build(library),
+    return new List<DartType>.generate(arguments!.length,
+        (int i) => arguments[i].buildAliased(library, TypeUse.typeArgument),
         growable: true);
   }
 
-  void checkTypesInOutline(TypeEnvironment typeEnvironment) {
-    libraryBuilder.checkBoundsInTypeParameters(
-        typeEnvironment, typedef.typeParameters, fileUri);
-    libraryBuilder.checkBoundsInType(
-        typedef.type!, typeEnvironment, fileUri, type?.charOffset ?? charOffset,
-        allowSuperBounded: false);
-  }
-
   void buildOutlineExpressions(
       ClassHierarchy classHierarchy,
       List<DelayedActionPerformer> delayedActionPerformers,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
index 9e4a88b..48a0929 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_demotion.dart
@@ -26,10 +26,6 @@
     for (NamedType namedParameterType in node.namedParameters) {
       if (namedParameterType.type.accept(this)) return true;
     }
-    TypedefType? typedefType = node.typedefType;
-    if (typedefType != null && typedefType.accept(this)) {
-      return true;
-    }
     return false;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 609515e..979bf9d 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -10,7 +10,8 @@
 import 'package:kernel/canonical_name.dart' as kernel;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/src/bounds_checks.dart' show calculateBounds;
+import 'package:kernel/src/bounds_checks.dart'
+    show calculateBounds, isGenericFunctionTypeOrAlias;
 import 'package:kernel/src/future_value_type.dart';
 import 'package:kernel/src/legacy_erasure.dart';
 import 'package:kernel/type_algebra.dart';
@@ -4875,6 +4876,22 @@
     return new EqualsNull(left)..fileOffset = fileOffset;
   }
 
+  /// Reports an error if [typeArgument] is a generic function type.
+  ///
+  /// This is use for reporting generic function types used as a type argument,
+  /// which was disallowed before the 'generic-metadata' feature was enabled.
+  void checkGenericFunctionTypeArgument(DartType typeArgument, int fileOffset) {
+    assert(!libraryBuilder.libraryFeatures.genericMetadata.isEnabled);
+    if (isGenericFunctionTypeOrAlias(typeArgument)) {
+      libraryBuilder.addProblem(
+          templateGenericFunctionTypeInferredAsActualTypeArgument.withArguments(
+              typeArgument, isNonNullableByDefault),
+          fileOffset,
+          noLength,
+          helper!.uri);
+    }
+  }
+
   DartType _computeInferredType(ExpressionInferenceResult result) =>
       identical(result.inferredType, noInferredType) || isNonNullableByDefault
           ? result.inferredType
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index acd6439..54c2b25 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -13,6 +13,7 @@
         NamedType,
         Nullability,
         TypedefType,
+        TypeParameter,
         Visitor;
 import 'package:kernel/src/assumptions.dart';
 import 'package:kernel/src/printer.dart';
@@ -122,8 +123,9 @@
     for (NamedType namedParameterType in node.namedParameters) {
       if (!namedParameterType.type.accept(this)) return false;
     }
-    if (node.typedefType != null && !node.typedefType!.accept(this)) {
-      return false;
+    for (TypeParameter typeParameter in node.typeParameters) {
+      if (!typeParameter.bound.accept(this)) return false;
+      if (!typeParameter.defaultType.accept(this)) return false;
     }
     return true;
   }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index dd2f233..aeb7072 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -49,10 +49,7 @@
               isRequired: named.isRequired))
           .toList(),
       typeParameters: newTypeParameters,
-      requiredParameterCount: type.requiredParameterCount,
-      typedefType: type.typedefType == null
-          ? null
-          : substitution.substituteType(type.typedefType!) as TypedefType);
+      requiredParameterCount: type.requiredParameterCount);
 }
 
 /// Given a [FunctionType], gets the type of the named parameter with the given
diff --git a/pkg/front_end/lib/src/fasta/uris.dart b/pkg/front_end/lib/src/fasta/uris.dart
new file mode 100644
index 0000000..28dc2e2
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/uris.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+final Uri dartCore = Uri.parse('dart:core');
+final Uri missingUri = Uri.parse('org-dartlang-internal:missing');
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index dae8e71..125a09d 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -429,6 +429,7 @@
 FunctionTypedParameterVar/script1: Fail
 FunctionUsedAsDec/analyzerCode: Fail
 GeneratorReturnsValue/example: Fail
+GenericFunctionTypeAsTypeArgumentThroughTypedef/example: Fail
 GetterNotFound/example: Fail
 GetterWithFormals/example: Fail
 IllegalAssignmentToNonAssignable/part_wrapped_script1: Fail
@@ -467,9 +468,6 @@
 IncompatibleRedirecteeFunctionType/part_wrapped_script6: Fail
 IncompatibleRedirecteeFunctionType/script6: Fail # Triggers multiple errors.
 IncompatibleRedirecteeFunctionTypeWarning/example: Fail
-IncorrectTypeArgumentInReturnTypeWarning/example: Fail
-IncorrectTypeArgumentInSupertypeInferredWarning/example: Fail
-IncorrectTypeArgumentInSupertypeWarning/example: Fail
 IncorrectTypeArgumentInferredWarning/example: Fail
 IncorrectTypeArgumentQualifiedInferredWarning/example: Fail
 IncorrectTypeArgumentQualifiedWarning/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index abf6263..745eead 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4453,22 +4453,6 @@
     class C<T> { foo<U extends num>() {} }
     main() { new C<String>().foo<String>(); }
 
-IncorrectTypeArgumentInSupertype:
-  problemMessage: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
-  correctionMessage: "Try changing type arguments so that they conform to the bounds."
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  script: >
-    class A<T extends num> {}
-    class B extends A<String> {}
-
-IncorrectTypeArgumentInReturnType:
-  problemMessage: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type."
-  correctionMessage: "Try changing type arguments so that they conform to the bounds."
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  script: >
-    class A<T extends num> {}
-    A<String> foo() => throw '';
-
 IncorrectTypeArgumentInferred:
   problemMessage: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
   correctionMessage: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -4485,14 +4469,6 @@
     class C<T> { foo<U extends num>(U u) {} }
     main() { new C<String>().foo(""); }
 
-IncorrectTypeArgumentInSupertypeInferred:
-  problemMessage: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
-  correctionMessage: "Try specifying type arguments explicitly so that they conform to the bounds."
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  script: >
-    class A<T extends A<T>> {}
-    class B extends A {}
-
 IncorrectTypeArgumentInstantiation:
   problemMessage: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3'."
   correctionMessage: "Try changing type arguments so that they conform to the bounds."
@@ -4560,6 +4536,11 @@
     bar<Y>(Y y) => null;
     main() { foo(bar); }
 
+GenericFunctionTypeAsTypeArgumentThroughTypedef:
+  problemMessage: "Generic function type '#type' used as a type argument through typedef '#type2'."
+  correctionMessage: "Try providing a non-generic function type explicitly."
+  analyzerCode: GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT
+
 # These two message templates are used for constructing supplemental text
 # about the origins of raw interface types in error messages containing types.
 TypeOrigin:
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index b143afe..6311cd6 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -60,6 +60,8 @@
 arise
 arising
 arity
+arm
+arms
 artifact
 artifacts
 artificial
@@ -259,6 +261,7 @@
 contra
 contribute
 convention
+conversely
 coordinated
 coordinating
 core
@@ -310,6 +313,7 @@
 decl
 decoupled
 decreases
+dedupe
 deduplication
 deemed
 deepest
@@ -343,6 +347,8 @@
 destinations
 destroy
 destructive
+destructure
+destructuring
 deterministic
 dev
 device
@@ -426,6 +432,7 @@
 eq
 equation
 equivalences
+erase
 erased
 es
 establish
@@ -437,9 +444,12 @@
 executor
 executors
 exhausted
+exhaustively
+exhaustiveness
 existence
 existentially
 exp
+expanded
 expando
 expense
 experimentation
@@ -606,6 +616,7 @@
 importantly
 imprecise
 improperly
+improves
 inapplicable
 inc
 incomparable
@@ -618,6 +629,7 @@
 indexing
 indirection
 individual
+individually
 inequality
 inequivalence
 inequivalences
@@ -642,6 +654,7 @@
 intends
 intentionally
 interested
+interfere
 interim
 interior
 interleaved
@@ -650,6 +663,7 @@
 interop
 interpolations
 interrupted
+intersections
 intersects
 interval
 intervals
@@ -717,6 +731,7 @@
 ld
 leafp
 leeway
+left's
 len
 lets
 letting
@@ -765,6 +780,7 @@
 macro
 macros
 maintaining
+malbounded
 mangled
 manipulation
 manner
@@ -859,6 +875,7 @@
 offending
 ogham
 oked
+omitting
 op
 opens
 opt
@@ -879,6 +896,7 @@
 outputs
 outputting
 overlap
+overlapping
 overloader
 overlooked
 overshadowed
@@ -967,6 +985,7 @@
 processor
 producers
 product
+profile
 progresses
 promo
 proof
@@ -1115,6 +1134,7 @@
 rf
 rhs
 ri
+right's
 rightmost
 risk
 rn
@@ -1157,6 +1177,7 @@
 serializables
 serializer
 serializers
+series
 serve
 server
 serves
@@ -1263,6 +1284,7 @@
 stringified
 stringify
 structs
+structurally
 structures
 stub
 stubs
@@ -1275,15 +1297,22 @@
 subexpression's
 subexpressions
 subgraph
+subname
 subnode
 subnodes
 subscription
 subsection
 subsections
+subspace
+subspaces
 subst
 substed
 substitutes
 substitutor
+subtracted
+subtracting
+subtraction
+subtracts
 suffixing
 suggests
 suite
@@ -1384,6 +1413,7 @@
 tty
 tuple
 twos
+type's
 typeref
 u
 ufeff
@@ -1421,6 +1451,7 @@
 unifier
 unifies
 unify
+uninhabited
 uninstantiable
 uninstantiated
 unintentionally
diff --git a/pkg/front_end/test/text_representation/data/types.dart b/pkg/front_end/test/text_representation/data/types.dart
index 029481c..4145fe9 100644
--- a/pkg/front_end/test/text_representation/data/types.dart
+++ b/pkg/front_end/test/text_representation/data/types.dart
@@ -155,51 +155,46 @@
 // TODO(johnniwinther): Support interdependent function type variables.
 //genericFunctionType5(T Function<T, S extends T>([T, S]) o) {}
 //genericFunctionType6(T Function<T extends S, S>([T, S]) o) {}
-typedefType1(
-    Typedef1 /*normal|limited.Typedef1*/ /*verbose.test::Typedef1*/ o) {}
+typedefType1(Typedef1 /*void Function()*/ o) {}
 typedefType2(
     Typedef2
-        /*normal|limited.Typedef2<dynamic>*/
-        /*verbose.test::Typedef2<dynamic>*/
+        /*void Function(dynamic)*/
         o) {}
 typedefType3(
     Typedef2<int>
-        /*normal|limited.Typedef2<int>*/
-        /*verbose.test::Typedef2<dart.core::int>*/
+        /*normal|limited.void Function(int)*/
+        /*verbose.void Function(dart.core::int)*/
         o1,
     Typedef2<int?>
-        /*normal|limited.Typedef2<int?>*/
-        /*verbose.test::Typedef2<dart.core::int?>*/
+        /*normal|limited.void Function(int?)*/
+        /*verbose.void Function(dart.core::int?)*/
         o2) {}
-typedefType4(
-    Typedef3 /*normal|limited.Typedef3*/ /*verbose.test::Typedef3*/ o) {}
+typedefType4(Typedef3 /*void Function()*/ o) {}
 typedefType5(
     Typedef4
-        /*normal|limited.Typedef4<dynamic>*/
-/*verbose.test::Typedef4<dynamic>*/
+        /*void Function(dynamic)*/
         o) {}
 typedefType7(
     Typedef4<int>
-        /*normal|limited.Typedef4<int>*/
-        /*verbose.test::Typedef4<dart.core::int>*/
+        /*normal|limited.void Function(int)*/
+        /*verbose.void Function(dart.core::int)*/
         o1,
     Typedef4<int>?
-        /*normal|limited.Typedef4<int>?*/
-        /*verbose.test::Typedef4<dart.core::int>?*/
+        /*normal|limited.void Function(int)?*/
+        /*verbose.void Function(dart.core::int)?*/
         o2) {}
 typedefType8(
     Typedef5
-        /*normal|limited.Typedef5<dynamic>*/
-        /*verbose.test::Typedef5<dynamic>*/
+        /*void Function<S>(dynamic, S%)*/
         o) {}
 typedefType9(
     Typedef5<int>
-        /*normal|limited.Typedef5<int>*/
-        /*verbose.test::Typedef5<dart.core::int>*/
+        /*normal|limited.void Function<S>(int, S%)*/
+        /*verbose.void Function<S>(dart.core::int, S%)*/
         o1,
     Typedef5<int?>?
-        /*normal|limited.Typedef5<int?>?*/
-        /*verbose.test::Typedef5<dart.core::int?>?*/
+        /*normal|limited.void Function<S>(int?, S%)?*/
+        /*verbose.void Function<S>(dart.core::int?, S%)?*/
         o2) {}
 
 method() {
diff --git a/pkg/front_end/test/text_representation/data/types_opt_out.dart b/pkg/front_end/test/text_representation/data/types_opt_out.dart
index b864336..94c86e8 100644
--- a/pkg/front_end/test/text_representation/data/types_opt_out.dart
+++ b/pkg/front_end/test/text_representation/data/types_opt_out.dart
@@ -99,42 +99,37 @@
 // TODO(johnniwinther): Support interdependent function type variables.
 //genericFunctionType5(T Function<T, S extends T>([T, S]) o) {}
 //genericFunctionType6(T Function<T extends S, S>([T, S]) o) {}
-typedefType1(
-    Typedef1 /*normal|limited.Typedef1**/ /*verbose.test::Typedef1**/ o) {}
+typedefType1(Typedef1 /*void Function()**/ o) {}
 typedefType2(
     Typedef2
-        /*normal|limited.Typedef2<dynamic>**/
-        /*verbose.test::Typedef2<dynamic>**/
+        /*void Function(dynamic)**/
         o) {}
 typedefType3(
     Typedef2<int>
-        /*normal|limited.Typedef2<int*>**/
-        /*verbose.test::Typedef2<dart.core::int*>**/
+        /*normal|limited.void Function(int*)**/
+        /*verbose.void Function(dart.core::int*)**/
         o) {}
 typedefType4(
     Typedef3
-        /*normal|limited.Typedef3**/
-        /*verbose.test::Typedef3**/
+        /*void Function()**/
         o) {}
 typedefType5(
     Typedef4
-        /*normal|limited.Typedef4<dynamic>**/
-        /*verbose.test::Typedef4<dynamic>**/
+        /*void Function(dynamic)**/
         o) {}
 typedefType7(
     Typedef4<int>
-        /*normal|limited.Typedef4<int*>**/
-        /*verbose.test::Typedef4<dart.core::int*>**/
+        /*normal|limited.void Function(int*)**/
+        /*verbose.void Function(dart.core::int*)**/
         o) {}
 typedefType8(
     Typedef5
-        /*normal|limited.Typedef5<dynamic>**/
-        /*verbose.test::Typedef5<dynamic>**/
+        /*void Function<S>(dynamic, S*)**/
         o) {}
 typedefType9(
     Typedef5<int>
-        /*normal|limited.Typedef5<int*>**/
-        /*verbose.test::Typedef5<dart.core::int*>**/
+        /*normal|limited.void Function<S>(int*, S*)**/
+        /*verbose.void Function<S>(dart.core::int*, S*)**/
         o) {}
 
 method() {
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index 24e5246..b92bd42 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_test.dart
@@ -181,11 +181,7 @@
       return node.constant.toText(strategy);
     } else if (node is VariableDeclaration) {
       DartType type = node.type;
-      if (type is FunctionType && type.typedefType != null) {
-        return type.typedefType!.toText(strategy);
-      } else {
-        return type.toText(strategy);
-      }
+      return type.toText(strategy);
     }
     return null;
   }
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart
new file mode 100644
index 0000000..05a8ef2
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+// Introduce an aliased type.
+typedef T<X> = X;
+
+// Use the aliased type.
+
+T<int>? v1;
+List<T<void>> v2 = [];
+final T<String> v3 = throw "Anything";
+const List<T<C>> v4 = [];
+const v5 = <Type, Type>{T: T};
+
+abstract class C {
+  static T<C>? v1;
+  static List<T<T>> v2 = [];
+  static final T<Null> v3 = throw "Anything";
+  static const List<T<List>> v4 = [];
+
+  T<D>? v5;
+  List<T<T>> v6 = [];
+  final T<Null> v7;
+
+  C() : v7 = null;
+  C.name1(this.v5, this.v7);
+  factory C.name2(T<D> arg1, T<Null> arg2) = C1.name1;
+
+  T<double> operator +(T<double> other);
+  T<FutureOr<FutureOr<void>>> get g;
+  set g(T<FutureOr<FutureOr<void>>> value);
+  Map<T<C>, T<C>> m1(covariant T<C> arg1, [Set<Set<T<C>>> arg2]);
+  void m2({T arg1, Map<T, T> arg2(T Function(T) arg21, T arg22)});
+}
+
+class C1 implements C {
+  C1.name1(T<D> arg1, T<Null> arg2);
+  noSuchMethod(Invocation invocation) => throw 0;
+}
+
+class D {}
+
+extension E on T<dynamic> {
+  T<dynamic> foo(T<dynamic> t) => t;
+}
+
+main() {
+  var v8 = <T<C>>[];
+  var v9 = <Set<T<T>>, Set<T<T>>>{{}: {}};
+  var v10 = {v8};
+  v9[{}] = {42};
+  Set<List<T<C>>> v11 = v10;
+  v10 = v11;
+}
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.strong.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.strong.expect
new file mode 100644
index 0000000..bc821c9
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.strong.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef T<X extends core::Object? = dynamic> = X%;
+abstract class C extends core::Object {
+  static field self::C? v1 = null;
+  static field core::List<dynamic> v2 = <dynamic>[];
+  static final field Null v3 = throw "Anything";
+  static const field core::List<core::List<dynamic>> v4 = #C1;
+  field self::D? v5;
+  field core::List<dynamic> v6 = <dynamic>[];
+  final field Null v7;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor •() → self::C
+    : self::C::v5 = null, self::C::v7 = null, super core::Object::•()
+    ;
+  constructor name1(self::D? v5, Null v7) → self::C
+    : self::C::v5 = v5, self::C::v7 = v7, super core::Object::•()
+    ;
+  static factory name2(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  static method _#name2#tearOff(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  abstract operator +(core::double other) → core::double;
+  abstract get g() → FutureOr<FutureOr<void>>?;
+  abstract set g(FutureOr<FutureOr<void>>? value) → void;
+  abstract method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>;
+  abstract method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void;
+}
+class C1 extends core::Object implements self::C {
+  constructor name1(self::D arg1, Null arg2) → self::C1
+    : super core::Object::•()
+    ;
+  static method _#name1#tearOff(self::D arg1, Null arg2) → self::C1
+    return new self::C1::name1(arg1, arg2);
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return throw 0;
+  no-such-method-forwarder get v7() → Null
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v7", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} Null;
+  no-such-method-forwarder operator +(core::double other) → core::double
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("+", <dynamic>[], <dynamic>[other], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  no-such-method-forwarder get v6() → core::List<dynamic>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<dynamic>;
+  no-such-method-forwarder get v5() → self::D?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::D?;
+  no-such-method-forwarder method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m1", <dynamic>[], <dynamic>[arg1, arg2], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::C, self::C>;
+  no-such-method-forwarder method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m2", <dynamic>[], <dynamic>[], <core::String, dynamic>{"arg1": arg1, "arg2": arg2}, 0)){(core::Invocation) → dynamic};
+  no-such-method-forwarder get g() → FutureOr<FutureOr<void>>?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<FutureOr<void>>?;
+  no-such-method-forwarder set v6(core::List<dynamic> value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set v5(self::D? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set g(FutureOr<FutureOr<void>>? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::D
+    return new self::D::•();
+}
+extension E on dynamic {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static field core::int? v1;
+static field core::List<void> v2 = <void>[];
+static final field core::String v3 = throw "Anything";
+static const field core::List<self::C> v4 = #C5;
+static const field core::Map<core::Type, core::Type> v5 = #C7;
+static method E|foo(lowered final dynamic #this, dynamic t) → dynamic
+  return t;
+static method E|get#foo(lowered final dynamic #this) → (dynamic) → dynamic
+  return (dynamic t) → dynamic => self::E|foo(#this, t);
+static method main() → dynamic {
+  core::List<self::C> v8 = <self::C>[];
+  core::Map<core::Set<dynamic>, core::Set<dynamic>> v9 = <core::Set<dynamic>, core::Set<dynamic>>{<dynamic>{}: <dynamic>{}};
+  core::Set<core::List<self::C>> v10 = <core::List<self::C>>{v8};
+  v9.{core::Map::[]=}(<dynamic>{}, <dynamic>{42}){(core::Set<dynamic>, core::Set<dynamic>) → void};
+  core::Set<core::List<self::C>> v11 = v10;
+  v10 = v11;
+}
+
+constants  {
+  #C1 = <core::List<dynamic>>[]
+  #C2 = constructor-tearoff self::C::name2
+  #C3 = null
+  #C4 = <core::String, dynamic>{)
+  #C5 = <self::C>[]
+  #C6 = TypeLiteralConstant(dynamic)
+  #C7 = <core::Type, core::Type>{#C6:#C6)
+}
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.strong.transformed.expect
new file mode 100644
index 0000000..bc821c9
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.strong.transformed.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef T<X extends core::Object? = dynamic> = X%;
+abstract class C extends core::Object {
+  static field self::C? v1 = null;
+  static field core::List<dynamic> v2 = <dynamic>[];
+  static final field Null v3 = throw "Anything";
+  static const field core::List<core::List<dynamic>> v4 = #C1;
+  field self::D? v5;
+  field core::List<dynamic> v6 = <dynamic>[];
+  final field Null v7;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor •() → self::C
+    : self::C::v5 = null, self::C::v7 = null, super core::Object::•()
+    ;
+  constructor name1(self::D? v5, Null v7) → self::C
+    : self::C::v5 = v5, self::C::v7 = v7, super core::Object::•()
+    ;
+  static factory name2(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  static method _#name2#tearOff(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  abstract operator +(core::double other) → core::double;
+  abstract get g() → FutureOr<FutureOr<void>>?;
+  abstract set g(FutureOr<FutureOr<void>>? value) → void;
+  abstract method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>;
+  abstract method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void;
+}
+class C1 extends core::Object implements self::C {
+  constructor name1(self::D arg1, Null arg2) → self::C1
+    : super core::Object::•()
+    ;
+  static method _#name1#tearOff(self::D arg1, Null arg2) → self::C1
+    return new self::C1::name1(arg1, arg2);
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return throw 0;
+  no-such-method-forwarder get v7() → Null
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v7", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} Null;
+  no-such-method-forwarder operator +(core::double other) → core::double
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("+", <dynamic>[], <dynamic>[other], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  no-such-method-forwarder get v6() → core::List<dynamic>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<dynamic>;
+  no-such-method-forwarder get v5() → self::D?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::D?;
+  no-such-method-forwarder method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m1", <dynamic>[], <dynamic>[arg1, arg2], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::C, self::C>;
+  no-such-method-forwarder method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m2", <dynamic>[], <dynamic>[], <core::String, dynamic>{"arg1": arg1, "arg2": arg2}, 0)){(core::Invocation) → dynamic};
+  no-such-method-forwarder get g() → FutureOr<FutureOr<void>>?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<FutureOr<void>>?;
+  no-such-method-forwarder set v6(core::List<dynamic> value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set v5(self::D? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set g(FutureOr<FutureOr<void>>? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::D
+    return new self::D::•();
+}
+extension E on dynamic {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static field core::int? v1;
+static field core::List<void> v2 = <void>[];
+static final field core::String v3 = throw "Anything";
+static const field core::List<self::C> v4 = #C5;
+static const field core::Map<core::Type, core::Type> v5 = #C7;
+static method E|foo(lowered final dynamic #this, dynamic t) → dynamic
+  return t;
+static method E|get#foo(lowered final dynamic #this) → (dynamic) → dynamic
+  return (dynamic t) → dynamic => self::E|foo(#this, t);
+static method main() → dynamic {
+  core::List<self::C> v8 = <self::C>[];
+  core::Map<core::Set<dynamic>, core::Set<dynamic>> v9 = <core::Set<dynamic>, core::Set<dynamic>>{<dynamic>{}: <dynamic>{}};
+  core::Set<core::List<self::C>> v10 = <core::List<self::C>>{v8};
+  v9.{core::Map::[]=}(<dynamic>{}, <dynamic>{42}){(core::Set<dynamic>, core::Set<dynamic>) → void};
+  core::Set<core::List<self::C>> v11 = v10;
+  v10 = v11;
+}
+
+constants  {
+  #C1 = <core::List<dynamic>>[]
+  #C2 = constructor-tearoff self::C::name2
+  #C3 = null
+  #C4 = <core::String, dynamic>{)
+  #C5 = <self::C>[]
+  #C6 = TypeLiteralConstant(dynamic)
+  #C7 = <core::Type, core::Type>{#C6:#C6)
+}
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.textual_outline.expect
new file mode 100644
index 0000000..7421287
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.textual_outline.expect
@@ -0,0 +1,39 @@
+import 'dart:async';
+
+typedef T<X> = X;
+T<int>? v1;
+List<T<void>> v2 = [];
+final T<String> v3 = throw "Anything";
+const List<T<C>> v4 = [];
+const v5 = <Type, Type>{T: T};
+
+abstract class C {
+  static T<C>? v1;
+  static List<T<T>> v2 = [];
+  static final T<Null> v3 = throw "Anything";
+  static const List<T<List>> v4 = [];
+  T<D>? v5;
+  List<T<T>> v6 = [];
+  final T<Null> v7;
+  C() : v7 = null;
+  C.name1(this.v5, this.v7);
+  factory C.name2(T<D> arg1, T<Null> arg2) = C1.name1;
+  T<double> operator +(T<double> other);
+  T<FutureOr<FutureOr<void>>> get g;
+  set g(T<FutureOr<FutureOr<void>>> value);
+  Map<T<C>, T<C>> m1(covariant T<C> arg1, [Set<Set<T<C>>> arg2]);
+  void m2({T arg1, Map<T, T> arg2(T Function(T) arg21, T arg22)});
+}
+
+class C1 implements C {
+  C1.name1(T<D> arg1, T<Null> arg2);
+  noSuchMethod(Invocation invocation) => throw 0;
+}
+
+class D {}
+
+extension E on T<dynamic> {
+  T<dynamic> foo(T<dynamic> t) => t;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..73acea0
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+import 'dart:async';
+
+List<T<void>> v2 = [];
+T<int>? v1;
+
+abstract class C {
+  C() : v7 = null;
+  C.name1(this.v5, this.v7);
+  List<T<T>> v6 = [];
+  Map<T<C>, T<C>> m1(covariant T<C> arg1, [Set<Set<T<C>>> arg2]);
+  T<D>? v5;
+  T<FutureOr<FutureOr<void>>> get g;
+  T<double> operator +(T<double> other);
+  factory C.name2(T<D> arg1, T<Null> arg2) = C1.name1;
+  final T<Null> v7;
+  set g(T<FutureOr<FutureOr<void>>> value);
+  static List<T<T>> v2 = [];
+  static T<C>? v1;
+  static const List<T<List>> v4 = [];
+  static final T<Null> v3 = throw "Anything";
+  void m2({T arg1, Map<T, T> arg2(T Function(T) arg21, T arg22)});
+}
+
+class C1 implements C {
+  C1.name1(T<D> arg1, T<Null> arg2);
+  noSuchMethod(Invocation invocation) => throw 0;
+}
+
+class D {}
+
+const List<T<C>> v4 = [];
+const v5 = <Type, Type>{T: T};
+
+extension E on T<dynamic> {
+  T<dynamic> foo(T<dynamic> t) => t;
+}
+
+final T<String> v3 = throw "Anything";
+main() {}
+typedef T<X> = X;
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.expect
new file mode 100644
index 0000000..5e2354d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef T<X extends core::Object? = dynamic> = X%;
+abstract class C extends core::Object {
+  static field self::C? v1 = null;
+  static field core::List<dynamic> v2 = <dynamic>[];
+  static final field Null v3 = throw "Anything";
+  static const field core::List<core::List<dynamic>> v4 = #C1;
+  field self::D? v5;
+  field core::List<dynamic> v6 = <dynamic>[];
+  final field Null v7;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor •() → self::C
+    : self::C::v5 = null, self::C::v7 = null, super core::Object::•()
+    ;
+  constructor name1(self::D? v5, Null v7) → self::C
+    : self::C::v5 = v5, self::C::v7 = v7, super core::Object::•()
+    ;
+  static factory name2(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  static method _#name2#tearOff(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  abstract operator +(core::double other) → core::double;
+  abstract get g() → FutureOr<FutureOr<void>>?;
+  abstract set g(FutureOr<FutureOr<void>>? value) → void;
+  abstract method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>;
+  abstract method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void;
+}
+class C1 extends core::Object implements self::C {
+  constructor name1(self::D arg1, Null arg2) → self::C1
+    : super core::Object::•()
+    ;
+  static method _#name1#tearOff(self::D arg1, Null arg2) → self::C1
+    return new self::C1::name1(arg1, arg2);
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return throw 0;
+  no-such-method-forwarder get v7() → Null
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v7", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} Null;
+  no-such-method-forwarder operator +(core::double other) → core::double
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("+", <dynamic>[], <dynamic>[other], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  no-such-method-forwarder get v6() → core::List<dynamic>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<dynamic>;
+  no-such-method-forwarder get v5() → self::D?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::D?;
+  no-such-method-forwarder method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m1", <dynamic>[], <dynamic>[arg1, arg2], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::C, self::C>;
+  no-such-method-forwarder method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m2", <dynamic>[], <dynamic>[], <core::String, dynamic>{"arg1": arg1, "arg2": arg2}, 0)){(core::Invocation) → dynamic};
+  no-such-method-forwarder get g() → FutureOr<FutureOr<void>>?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<FutureOr<void>>?;
+  no-such-method-forwarder set v6(core::List<dynamic> value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set v5(self::D? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set g(FutureOr<FutureOr<void>>? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::D
+    return new self::D::•();
+}
+extension E on dynamic {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static field core::int? v1;
+static field core::List<void> v2 = <void>[];
+static final field core::String v3 = throw "Anything";
+static const field core::List<self::C> v4 = #C5;
+static const field core::Map<core::Type, core::Type> v5 = #C7;
+static method E|foo(lowered final dynamic #this, dynamic t) → dynamic
+  return t;
+static method E|get#foo(lowered final dynamic #this) → (dynamic) → dynamic
+  return (dynamic t) → dynamic => self::E|foo(#this, t);
+static method main() → dynamic {
+  core::List<self::C> v8 = <self::C>[];
+  core::Map<core::Set<dynamic>, core::Set<dynamic>> v9 = <core::Set<dynamic>, core::Set<dynamic>>{<dynamic>{}: <dynamic>{}};
+  core::Set<core::List<self::C>> v10 = <core::List<self::C>>{v8};
+  v9.{core::Map::[]=}(<dynamic>{}, <dynamic>{42}){(core::Set<dynamic>, core::Set<dynamic>) → void};
+  core::Set<core::List<self::C>> v11 = v10;
+  v10 = v11;
+}
+
+constants  {
+  #C1 = <core::List<dynamic>*>[]
+  #C2 = constructor-tearoff self::C::name2
+  #C3 = null
+  #C4 = <core::String*, dynamic>{)
+  #C5 = <self::C*>[]
+  #C6 = TypeLiteralConstant(dynamic)
+  #C7 = <core::Type*, core::Type*>{#C6:#C6)
+}
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..5e2354d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef T<X extends core::Object? = dynamic> = X%;
+abstract class C extends core::Object {
+  static field self::C? v1 = null;
+  static field core::List<dynamic> v2 = <dynamic>[];
+  static final field Null v3 = throw "Anything";
+  static const field core::List<core::List<dynamic>> v4 = #C1;
+  field self::D? v5;
+  field core::List<dynamic> v6 = <dynamic>[];
+  final field Null v7;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor •() → self::C
+    : self::C::v5 = null, self::C::v7 = null, super core::Object::•()
+    ;
+  constructor name1(self::D? v5, Null v7) → self::C
+    : self::C::v5 = v5, self::C::v7 = v7, super core::Object::•()
+    ;
+  static factory name2(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  static method _#name2#tearOff(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  abstract operator +(core::double other) → core::double;
+  abstract get g() → FutureOr<FutureOr<void>>?;
+  abstract set g(FutureOr<FutureOr<void>>? value) → void;
+  abstract method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>;
+  abstract method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void;
+}
+class C1 extends core::Object implements self::C {
+  constructor name1(self::D arg1, Null arg2) → self::C1
+    : super core::Object::•()
+    ;
+  static method _#name1#tearOff(self::D arg1, Null arg2) → self::C1
+    return new self::C1::name1(arg1, arg2);
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return throw 0;
+  no-such-method-forwarder get v7() → Null
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v7", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} Null;
+  no-such-method-forwarder operator +(core::double other) → core::double
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("+", <dynamic>[], <dynamic>[other], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  no-such-method-forwarder get v6() → core::List<dynamic>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<dynamic>;
+  no-such-method-forwarder get v5() → self::D?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::D?;
+  no-such-method-forwarder method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m1", <dynamic>[], <dynamic>[arg1, arg2], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::C, self::C>;
+  no-such-method-forwarder method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m2", <dynamic>[], <dynamic>[], <core::String, dynamic>{"arg1": arg1, "arg2": arg2}, 0)){(core::Invocation) → dynamic};
+  no-such-method-forwarder get g() → FutureOr<FutureOr<void>>?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<FutureOr<void>>?;
+  no-such-method-forwarder set v6(core::List<dynamic> value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set v5(self::D? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set g(FutureOr<FutureOr<void>>? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::D
+    return new self::D::•();
+}
+extension E on dynamic {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static field core::int? v1;
+static field core::List<void> v2 = <void>[];
+static final field core::String v3 = throw "Anything";
+static const field core::List<self::C> v4 = #C5;
+static const field core::Map<core::Type, core::Type> v5 = #C7;
+static method E|foo(lowered final dynamic #this, dynamic t) → dynamic
+  return t;
+static method E|get#foo(lowered final dynamic #this) → (dynamic) → dynamic
+  return (dynamic t) → dynamic => self::E|foo(#this, t);
+static method main() → dynamic {
+  core::List<self::C> v8 = <self::C>[];
+  core::Map<core::Set<dynamic>, core::Set<dynamic>> v9 = <core::Set<dynamic>, core::Set<dynamic>>{<dynamic>{}: <dynamic>{}};
+  core::Set<core::List<self::C>> v10 = <core::List<self::C>>{v8};
+  v9.{core::Map::[]=}(<dynamic>{}, <dynamic>{42}){(core::Set<dynamic>, core::Set<dynamic>) → void};
+  core::Set<core::List<self::C>> v11 = v10;
+  v10 = v11;
+}
+
+constants  {
+  #C1 = <core::List<dynamic>*>[]
+  #C2 = constructor-tearoff self::C::name2
+  #C3 = null
+  #C4 = <core::String*, dynamic>{)
+  #C5 = <self::C*>[]
+  #C6 = TypeLiteralConstant(dynamic)
+  #C7 = <core::Type*, core::Type*>{#C6:#C6)
+}
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.outline.expect
new file mode 100644
index 0000000..5ba3b99
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.outline.expect
@@ -0,0 +1,96 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef T<X extends core::Object? = dynamic> = X%;
+abstract class C extends core::Object {
+  static field self::C? v1;
+  static field core::List<dynamic> v2;
+  static final field Null v3;
+  static const field core::List<core::List<dynamic>> v4 = const <core::List<dynamic>>[];
+  field self::D? v5;
+  field core::List<dynamic> v6;
+  final field Null v7;
+  static final field dynamic _redirecting# = <dynamic>[self::C::name2]/*isLegacy*/;
+  constructor •() → self::C
+    ;
+  constructor name1(self::D? v5, Null v7) → self::C
+    ;
+  static factory name2(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  static method _#name2#tearOff(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  abstract operator +(core::double other) → core::double;
+  abstract get g() → FutureOr<FutureOr<void>>?;
+  abstract set g(FutureOr<FutureOr<void>>? value) → void;
+  abstract method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = null]) → core::Map<self::C, self::C>;
+  abstract method m2({dynamic arg1 = null, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = null}) → void;
+}
+class C1 extends core::Object implements self::C {
+  constructor name1(self::D arg1, Null arg2) → self::C1
+    ;
+  static method _#name1#tearOff(self::D arg1, Null arg2) → self::C1
+    return new self::C1::name1(arg1, arg2);
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    ;
+  no-such-method-forwarder get v7() → Null
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v7", <dynamic>[], <dynamic>[], const <core::String, dynamic>{}, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} Null;
+  no-such-method-forwarder operator +(core::double other) → core::double
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("+", <dynamic>[], <dynamic>[other], const <core::String, dynamic>{}, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  no-such-method-forwarder get v6() → core::List<dynamic>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6", <dynamic>[], <dynamic>[], const <core::String, dynamic>{}, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<dynamic>;
+  no-such-method-forwarder get v5() → self::D?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5", <dynamic>[], <dynamic>[], const <core::String, dynamic>{}, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::D?;
+  no-such-method-forwarder method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2]) → core::Map<self::C, self::C>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m1", <dynamic>[], <dynamic>[arg1, arg2], const <core::String, dynamic>{}, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::C, self::C>;
+  no-such-method-forwarder method m2({dynamic arg1, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2}) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m2", <dynamic>[], <dynamic>[], <core::String, dynamic>{"arg1": arg1, "arg2": arg2}, 0)){(core::Invocation) → dynamic};
+  no-such-method-forwarder get g() → FutureOr<FutureOr<void>>?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g", <dynamic>[], <dynamic>[], const <core::String, dynamic>{}, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<FutureOr<void>>?;
+  no-such-method-forwarder set v6(core::List<dynamic> value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6=", <dynamic>[], <dynamic>[value], const <core::String, dynamic>{}, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set v5(self::D? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5=", <dynamic>[], <dynamic>[value], const <core::String, dynamic>{}, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set g(FutureOr<FutureOr<void>>? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g=", <dynamic>[], <dynamic>[value], const <core::String, dynamic>{}, 2)){(core::Invocation) → dynamic};
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    ;
+  static method _#new#tearOff() → self::D
+    return new self::D::•();
+}
+extension E on dynamic {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static field core::int? v1;
+static field core::List<void> v2;
+static final field core::String v3;
+static const field core::List<self::C> v4 = const <self::C>[];
+static const field core::Map<core::Type, core::Type> v5 = const <core::Type, core::Type>{dynamic: dynamic};
+static method E|foo(lowered final dynamic #this, dynamic t) → dynamic
+  ;
+static method E|get#foo(lowered final dynamic #this) → (dynamic) → dynamic
+  return (dynamic t) → dynamic => self::E|foo(#this, t);
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:22:35 -> ListConstant(const <List<dynamic>*>[])
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///generic_usage_type_variable.dart:18:16 -> ConstructorTearOffConstant(C.name2)
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:26:17 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:32:22 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:25:14 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:24:9 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:35:19 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:33:35 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:25:14 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:24:9 -> MapConstant(const <String*, dynamic>{})
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:34:7 -> MapConstant(const <String*, dynamic>{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:15:23 -> ListConstant(const <C*>[])
+Evaluated: MapLiteral @ org-dartlang-testcase:///generic_usage_type_variable.dart:16:24 -> MapConstant(const <Type*, Type*>{dynamic: dynamic})
+Extra constant evaluation: evaluated: 93, effectively constant: 13
diff --git a/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.transformed.expect
new file mode 100644
index 0000000..5e2354d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/generic_usage_type_variable.dart.weak.transformed.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef T<X extends core::Object? = dynamic> = X%;
+abstract class C extends core::Object {
+  static field self::C? v1 = null;
+  static field core::List<dynamic> v2 = <dynamic>[];
+  static final field Null v3 = throw "Anything";
+  static const field core::List<core::List<dynamic>> v4 = #C1;
+  field self::D? v5;
+  field core::List<dynamic> v6 = <dynamic>[];
+  final field Null v7;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor •() → self::C
+    : self::C::v5 = null, self::C::v7 = null, super core::Object::•()
+    ;
+  constructor name1(self::D? v5, Null v7) → self::C
+    : self::C::v5 = v5, self::C::v7 = v7, super core::Object::•()
+    ;
+  static factory name2(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  static method _#name2#tearOff(self::D arg1, Null arg2) → self::C
+    return new self::C1::name1(arg1, arg2);
+  abstract operator +(core::double other) → core::double;
+  abstract get g() → FutureOr<FutureOr<void>>?;
+  abstract set g(FutureOr<FutureOr<void>>? value) → void;
+  abstract method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>;
+  abstract method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void;
+}
+class C1 extends core::Object implements self::C {
+  constructor name1(self::D arg1, Null arg2) → self::C1
+    : super core::Object::•()
+    ;
+  static method _#name1#tearOff(self::D arg1, Null arg2) → self::C1
+    return new self::C1::name1(arg1, arg2);
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return throw 0;
+  no-such-method-forwarder get v7() → Null
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v7", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} Null;
+  no-such-method-forwarder operator +(core::double other) → core::double
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("+", <dynamic>[], <dynamic>[other], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  no-such-method-forwarder get v6() → core::List<dynamic>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<dynamic>;
+  no-such-method-forwarder get v5() → self::D?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::D?;
+  no-such-method-forwarder method m1(covariant-by-declaration self::C arg1, [core::Set<core::Set<self::C>> arg2 = #C3]) → core::Map<self::C, self::C>
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m1", <dynamic>[], <dynamic>[arg1, arg2], #C4, 0)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::C, self::C>;
+  no-such-method-forwarder method m2({dynamic arg1 = #C3, ((dynamic) → dynamic, dynamic) → core::Map<dynamic, dynamic> arg2 = #C3}) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("m2", <dynamic>[], <dynamic>[], <core::String, dynamic>{"arg1": arg1, "arg2": arg2}, 0)){(core::Invocation) → dynamic};
+  no-such-method-forwarder get g() → FutureOr<FutureOr<void>>?
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g", <dynamic>[], <dynamic>[], #C4, 1)){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<FutureOr<void>>?;
+  no-such-method-forwarder set v6(core::List<dynamic> value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v6=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set v5(self::D? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("v5=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+  no-such-method-forwarder set g(FutureOr<FutureOr<void>>? value) → void
+    return this.{self::C1::noSuchMethod}(core::_createInvocationMirror("g=", <dynamic>[], <dynamic>[value], #C4, 2)){(core::Invocation) → dynamic};
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::D
+    return new self::D::•();
+}
+extension E on dynamic {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static field core::int? v1;
+static field core::List<void> v2 = <void>[];
+static final field core::String v3 = throw "Anything";
+static const field core::List<self::C> v4 = #C5;
+static const field core::Map<core::Type, core::Type> v5 = #C7;
+static method E|foo(lowered final dynamic #this, dynamic t) → dynamic
+  return t;
+static method E|get#foo(lowered final dynamic #this) → (dynamic) → dynamic
+  return (dynamic t) → dynamic => self::E|foo(#this, t);
+static method main() → dynamic {
+  core::List<self::C> v8 = <self::C>[];
+  core::Map<core::Set<dynamic>, core::Set<dynamic>> v9 = <core::Set<dynamic>, core::Set<dynamic>>{<dynamic>{}: <dynamic>{}};
+  core::Set<core::List<self::C>> v10 = <core::List<self::C>>{v8};
+  v9.{core::Map::[]=}(<dynamic>{}, <dynamic>{42}){(core::Set<dynamic>, core::Set<dynamic>) → void};
+  core::Set<core::List<self::C>> v11 = v10;
+  v10 = v11;
+}
+
+constants  {
+  #C1 = <core::List<dynamic>*>[]
+  #C2 = constructor-tearoff self::C::name2
+  #C3 = null
+  #C4 = <core::String*, dynamic>{)
+  #C5 = <self::C*>[]
+  #C6 = TypeLiteralConstant(dynamic)
+  #C7 = <core::Type*, core::Type*>{#C6:#C6)
+}
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart b/pkg/front_end/testcases/general/bounds_as_is.dart
new file mode 100644
index 0000000..419c5ae
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+t1a(o) => o as F; // Ok
+t2a(o) => o as F<dynamic>; // Ok
+t3a(o) => o as F<Class>; // Ok
+t4a(o) => o as F<Class<dynamic>>; // Ok
+t5a(o) => o as F<ConcreteClass>; // Ok
+t6a(o) => o as F<Class<ConcreteClass>>; // Ok
+t7a(o) => o as F<Object>; // Error
+t8a(o) => o as F<int>; // Error
+s1a(o) => o as G; // Ok
+s2a(o) => o as G<dynamic>; // Ok
+s3a(o) => o as G<Class>; // Ok
+s4a(o) => o as G<Class<dynamic>>; // Ok
+s5a(o) => o as G<ConcreteClass>; // Ok
+s6a(o) => o as G<Class<ConcreteClass>>; // Ok
+s7a(o) => o as G<Object>; // Error
+s8a(o) => o as G<int>; // Error
+
+t1b(o) => o is F; // Ok
+t2b(o) => o is F<dynamic>; // Ok
+t3b(o) => o is F<Class>; // Ok
+t4b(o) => o is F<Class<dynamic>>; // Ok
+t5b(o) => o is F<ConcreteClass>; // Ok
+t6b(o) => o is F<Class<ConcreteClass>>; // Ok
+t7b(o) => o is F<Object>; // Error
+t8b(o) => o is F<int>; // Error
+s1b(o) => o is G; // Ok
+s2b(o) => o is G<dynamic>; // Ok
+s3b(o) => o is G<Class>; // Ok
+s4b(o) => o is G<Class<dynamic>>; // Ok
+s5b(o) => o is G<ConcreteClass>; // Ok
+s6b(o) => o is G<Class<ConcreteClass>>; // Ok
+s7b(o) => o is G<Object>; // Error
+s8b(o) => o is G<int>; // Error
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_as_is.dart.textual_outline.expect
new file mode 100644
index 0000000..7555a22
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart.textual_outline.expect
@@ -0,0 +1,41 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+t1a(o) => o as F;
+t2a(o) => o as F<dynamic>;
+t3a(o) => o as F<Class>;
+t4a(o) => o as F<Class<dynamic>>;
+t5a(o) => o as F<ConcreteClass>;
+t6a(o) => o as F<Class<ConcreteClass>>;
+t7a(o) => o as F<Object>;
+t8a(o) => o as F<int>;
+s1a(o) => o as G;
+s2a(o) => o as G<dynamic>;
+s3a(o) => o as G<Class>;
+s4a(o) => o as G<Class<dynamic>>;
+s5a(o) => o as G<ConcreteClass>;
+s6a(o) => o as G<Class<ConcreteClass>>;
+s7a(o) => o as G<Object>;
+s8a(o) => o as G<int>;
+t1b(o) => o is F;
+t2b(o) => o is F<dynamic>;
+t3b(o) => o is F<Class>;
+t4b(o) => o is F<Class<dynamic>>;
+t5b(o) => o is F<ConcreteClass>;
+t6b(o) => o is F<Class<ConcreteClass>>;
+t7b(o) => o is F<Object>;
+t8b(o) => o is F<int>;
+s1b(o) => o is G;
+s2b(o) => o is G<dynamic>;
+s3b(o) => o is G<Class>;
+s4b(o) => o is G<Class<dynamic>>;
+s5b(o) => o is G<ConcreteClass>;
+s6b(o) => o is G<Class<ConcreteClass>>;
+s7b(o) => o is G<Object>;
+s8b(o) => o is G<int>;
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_as_is.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..733c503
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+s1a(o) => o as G;
+s1b(o) => o is G;
+s2a(o) => o as G<dynamic>;
+s2b(o) => o is G<dynamic>;
+s3a(o) => o as G<Class>;
+s3b(o) => o is G<Class>;
+s4a(o) => o as G<Class<dynamic>>;
+s4b(o) => o is G<Class<dynamic>>;
+s5a(o) => o as G<ConcreteClass>;
+s5b(o) => o is G<ConcreteClass>;
+s6a(o) => o as G<Class<ConcreteClass>>;
+s6b(o) => o is G<Class<ConcreteClass>>;
+s7a(o) => o as G<Object>;
+s7b(o) => o is G<Object>;
+s8a(o) => o as G<int>;
+s8b(o) => o is G<int>;
+t1a(o) => o as F;
+t1b(o) => o is F;
+t2a(o) => o as F<dynamic>;
+t2b(o) => o is F<dynamic>;
+t3a(o) => o as F<Class>;
+t3b(o) => o is F<Class>;
+t4a(o) => o as F<Class<dynamic>>;
+t4b(o) => o is F<Class<dynamic>>;
+t5a(o) => o as F<ConcreteClass>;
+t5b(o) => o is F<ConcreteClass>;
+t6a(o) => o as F<Class<ConcreteClass>>;
+t6b(o) => o is F<Class<ConcreteClass>>;
+t7a(o) => o as F<Object>;
+t7b(o) => o is F<Object>;
+t8a(o) => o as F<int>;
+t8b(o) => o is F<int>;
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart.weak.expect b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.expect
new file mode 100644
index 0000000..2156140
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.expect
@@ -0,0 +1,164 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_as_is.dart:19: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t7a(o) => o as F<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:20: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t8a(o) => o as F<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:27: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s7a(o) => o as G<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:28: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s8a(o) => o as G<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:36: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t7b(o) => o is F<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:37: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t8b(o) => o is F<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:44: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s7b(o) => o is G<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:45: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s8b(o) => o is G<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method t1a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t2a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} dynamic;
+static method t3a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t4a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t5a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::ConcreteClass;
+static method t6a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<self::ConcreteClass>;
+static method t7a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} core::Object;
+static method t8a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} core::int;
+static method s1a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s2a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<dynamic>;
+static method s3a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s4a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s5a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::ConcreteClass>;
+static method s6a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<self::ConcreteClass>>;
+static method s7a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<core::Object>;
+static method s8a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<core::int>;
+static method t1b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t2b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} dynamic;
+static method t3b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t4b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t5b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::ConcreteClass;
+static method t6b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<self::ConcreteClass>;
+static method t7b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} core::Object;
+static method t8b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} core::int;
+static method s1b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s2b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<dynamic>;
+static method s3b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s4b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s5b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::ConcreteClass>;
+static method s6b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<self::ConcreteClass>>;
+static method s7b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<core::Object>;
+static method s8b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<core::int>;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.modular.expect
new file mode 100644
index 0000000..2156140
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.modular.expect
@@ -0,0 +1,164 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_as_is.dart:19: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t7a(o) => o as F<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:20: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t8a(o) => o as F<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:27: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s7a(o) => o as G<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:28: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s8a(o) => o as G<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:36: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t7b(o) => o is F<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:37: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t8b(o) => o is F<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:44: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s7b(o) => o is G<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:45: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s8b(o) => o is G<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method t1a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t2a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} dynamic;
+static method t3a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t4a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t5a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::ConcreteClass;
+static method t6a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<self::ConcreteClass>;
+static method t7a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} core::Object;
+static method t8a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} core::int;
+static method s1a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s2a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<dynamic>;
+static method s3a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s4a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s5a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::ConcreteClass>;
+static method s6a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<self::ConcreteClass>>;
+static method s7a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<core::Object>;
+static method s8a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<core::int>;
+static method t1b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t2b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} dynamic;
+static method t3b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t4b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t5b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::ConcreteClass;
+static method t6b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<self::ConcreteClass>;
+static method t7b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} core::Object;
+static method t8b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} core::int;
+static method s1b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s2b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<dynamic>;
+static method s3b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s4b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s5b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::ConcreteClass>;
+static method s6b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<self::ConcreteClass>>;
+static method s7b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<core::Object>;
+static method s8b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<core::int>;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.outline.expect
new file mode 100644
index 0000000..1dafbce
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.outline.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+static method t1a(dynamic o) → dynamic
+  ;
+static method t2a(dynamic o) → dynamic
+  ;
+static method t3a(dynamic o) → dynamic
+  ;
+static method t4a(dynamic o) → dynamic
+  ;
+static method t5a(dynamic o) → dynamic
+  ;
+static method t6a(dynamic o) → dynamic
+  ;
+static method t7a(dynamic o) → dynamic
+  ;
+static method t8a(dynamic o) → dynamic
+  ;
+static method s1a(dynamic o) → dynamic
+  ;
+static method s2a(dynamic o) → dynamic
+  ;
+static method s3a(dynamic o) → dynamic
+  ;
+static method s4a(dynamic o) → dynamic
+  ;
+static method s5a(dynamic o) → dynamic
+  ;
+static method s6a(dynamic o) → dynamic
+  ;
+static method s7a(dynamic o) → dynamic
+  ;
+static method s8a(dynamic o) → dynamic
+  ;
+static method t1b(dynamic o) → dynamic
+  ;
+static method t2b(dynamic o) → dynamic
+  ;
+static method t3b(dynamic o) → dynamic
+  ;
+static method t4b(dynamic o) → dynamic
+  ;
+static method t5b(dynamic o) → dynamic
+  ;
+static method t6b(dynamic o) → dynamic
+  ;
+static method t7b(dynamic o) → dynamic
+  ;
+static method t8b(dynamic o) → dynamic
+  ;
+static method s1b(dynamic o) → dynamic
+  ;
+static method s2b(dynamic o) → dynamic
+  ;
+static method s3b(dynamic o) → dynamic
+  ;
+static method s4b(dynamic o) → dynamic
+  ;
+static method s5b(dynamic o) → dynamic
+  ;
+static method s6b(dynamic o) → dynamic
+  ;
+static method s7b(dynamic o) → dynamic
+  ;
+static method s8b(dynamic o) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_as_is.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.transformed.expect
new file mode 100644
index 0000000..e45870b
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_as_is.dart.weak.transformed.expect
@@ -0,0 +1,164 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_as_is.dart:19: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t7a(o) => o as F<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:20: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t8a(o) => o as F<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:27: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s7a(o) => o as G<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:28: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s8a(o) => o as G<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:36: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t7b(o) => o is F<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:37: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// t8b(o) => o is F<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:44: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s7b(o) => o is G<Object>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.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_as_is.dart:45: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_as_is.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// s8b(o) => o is G<int>; // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_as_is.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method t1a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t2a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} dynamic;
+static method t3a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t4a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<dynamic>;
+static method t5a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::ConcreteClass;
+static method t6a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::Class<self::ConcreteClass>;
+static method t7a(dynamic o) → dynamic
+  return o;
+static method t8a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} core::int;
+static method s1a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s2a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<dynamic>;
+static method s3a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s4a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s5a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::ConcreteClass>;
+static method s6a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<self::Class<self::ConcreteClass>>;
+static method s7a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<core::Object>;
+static method s8a(dynamic o) → dynamic
+  return o as{ForNonNullableByDefault} self::G<core::int>;
+static method t1b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t2b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} dynamic;
+static method t3b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t4b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<dynamic>;
+static method t5b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::ConcreteClass;
+static method t6b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::Class<self::ConcreteClass>;
+static method t7b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} core::Object;
+static method t8b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} core::int;
+static method s1b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s2b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<dynamic>;
+static method s3b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s4b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<dynamic>>;
+static method s5b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::ConcreteClass>;
+static method s6b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<self::Class<self::ConcreteClass>>;
+static method s7b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<core::Object>;
+static method s8b(dynamic o) → dynamic
+  return o is{ForNonNullableByDefault} self::G<core::int>;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart b/pkg/front_end/testcases/general/bounds_catch.dart
new file mode 100644
index 0000000..84f78bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart
@@ -0,0 +1,205 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+t1a() {
+  try {} on F catch (e) {
+    // Ok
+  }
+}
+
+t2a() {
+  try {} on F<dynamic> catch (e) {
+    // Ok
+  }
+}
+
+t3a() {
+  try {} on F<Class> catch (e) {
+    // Ok
+  }
+}
+
+t4a() {
+  try {} on F<Class<dynamic>> catch (e) {
+    // Ok
+  }
+}
+
+t5a() {
+  try {} on F<ConcreteClass> catch (e) {
+    // Ok
+  }
+}
+
+t6a() {
+  try {} on F<Class<ConcreteClass>> catch (e) {
+    // Ok
+  }
+}
+
+t7a() {
+  try {} on F<Object> catch (e) {
+    // Error
+  }
+}
+
+t8a() {
+  try {} on F<int> catch (e) {
+    // Error
+  }
+}
+
+s1a() {
+  try {} on G catch (e) {
+    // Ok
+  }
+}
+
+s2a() {
+  try {} on G<dynamic> catch (e) {
+    // Ok
+  }
+}
+
+s3a() {
+  try {} on G<Class> catch (e) {
+    // Ok
+  }
+}
+
+s4a() {
+  try {} on G<Class<dynamic>> catch (e) {
+    // Ok
+  }
+}
+
+s5a() {
+  try {} on G<ConcreteClass> catch (e) {
+    // Ok
+  }
+}
+
+s6a() {
+  try {} on G<Class<ConcreteClass>> catch (e) {
+    // Ok
+  }
+}
+
+s7a() {
+  try {} on G<Object> catch (e) {
+    // Error
+  }
+}
+
+s8a() {
+  try {} on G<int> catch (e) {
+    // Error
+  }
+}
+
+t1b() {
+  try {} on F catch (e) {
+    // Ok
+  }
+}
+
+t2b() {
+  try {} on F<dynamic> catch (e) {
+    // Ok
+  }
+}
+
+t3b() {
+  try {} on F<Class> catch (e) {
+    // Ok
+  }
+}
+
+t4b() {
+  try {} on F<Class<dynamic>> catch (e) {
+    // Ok
+  }
+}
+
+t5b() {
+  try {} on F<ConcreteClass> catch (e) {
+    // Ok
+  }
+}
+
+t6b() {
+  try {} on F<Class<ConcreteClass>> catch (e) {
+    // Ok
+  }
+}
+
+t7b() {
+  try {} on F<Object> catch (e) {
+    // Error
+  }
+}
+
+t8b() {
+  try {} on F<int> catch (e) {
+    // Error
+  }
+}
+
+s1b() {
+  try {} on G catch (e) {
+    // Ok
+  }
+}
+
+s2b() {
+  try {} on G<dynamic> catch (e) {
+    // Ok
+  }
+}
+
+s3b() {
+  try {} on G<Class> catch (e) {
+    // Ok
+  }
+}
+
+s4b() {
+  try {} on G<Class<dynamic>> catch (e) {
+    // Ok
+  }
+}
+
+s5b() {
+  try {} on G<ConcreteClass> catch (e) {
+    // Ok
+  }
+}
+
+s6b() {
+  try {} on G<Class<ConcreteClass>> catch (e) {
+    // Ok
+  }
+}
+
+s7b() {
+  try {} on G<Object> catch (e) {
+    // Error
+  }
+}
+
+s8b() {
+  try {} on G<int> catch (e) {
+    // Error
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_catch.dart.textual_outline.expect
new file mode 100644
index 0000000..986be5e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart.textual_outline.expect
@@ -0,0 +1,41 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+t1a() {}
+t2a() {}
+t3a() {}
+t4a() {}
+t5a() {}
+t6a() {}
+t7a() {}
+t8a() {}
+s1a() {}
+s2a() {}
+s3a() {}
+s4a() {}
+s5a() {}
+s6a() {}
+s7a() {}
+s8a() {}
+t1b() {}
+t2b() {}
+t3b() {}
+t4b() {}
+t5b() {}
+t6b() {}
+t7b() {}
+t8b() {}
+s1b() {}
+s2b() {}
+s3b() {}
+s4b() {}
+s5b() {}
+s6b() {}
+s7b() {}
+s8b() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_catch.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ff62b0a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart.textual_outline_modelled.expect
@@ -0,0 +1,40 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+s1a() {}
+s1b() {}
+s2a() {}
+s2b() {}
+s3a() {}
+s3b() {}
+s4a() {}
+s4b() {}
+s5a() {}
+s5b() {}
+s6a() {}
+s6b() {}
+s7a() {}
+s7b() {}
+s8a() {}
+s8b() {}
+t1a() {}
+t1b() {}
+t2a() {}
+t2b() {}
+t3a() {}
+t3b() {}
+t4a() {}
+t4b() {}
+t5a() {}
+t5b() {}
+t6a() {}
+t6b() {}
+t7a() {}
+t7b() {}
+t8a() {}
+t8b() {}
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart.weak.expect b/pkg/front_end/testcases/general/bounds_catch.dart.weak.expect
new file mode 100644
index 0000000..d56af17
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart.weak.expect
@@ -0,0 +1,292 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_catch.dart:50:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:56:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:98:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:104:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:146:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:152:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:194:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:200:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method t1a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t2a() → dynamic {
+  try {
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method t3a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t4a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t5a() → dynamic {
+  try {
+  }
+  on self::ConcreteClass catch(final self::ConcreteClass e) {
+  }
+}
+static method t6a() → dynamic {
+  try {
+  }
+  on self::Class<self::ConcreteClass> catch(final self::Class<self::ConcreteClass> e) {
+  }
+}
+static method t7a() → dynamic {
+  try {
+  }
+  on core::Object catch(final core::Object e) {
+  }
+}
+static method t8a() → dynamic {
+  try {
+  }
+  on core::int catch(final core::int e) {
+  }
+}
+static method s1a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s2a() → dynamic {
+  try {
+  }
+  on self::G<dynamic> catch(final self::G<dynamic> e) {
+  }
+}
+static method s3a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s4a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s5a() → dynamic {
+  try {
+  }
+  on self::G<self::ConcreteClass> catch(final self::G<self::ConcreteClass> e) {
+  }
+}
+static method s6a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<self::ConcreteClass>> catch(final self::G<self::Class<self::ConcreteClass>> e) {
+  }
+}
+static method s7a() → dynamic {
+  try {
+  }
+  on self::G<core::Object> catch(final self::G<core::Object> e) {
+  }
+}
+static method s8a() → dynamic {
+  try {
+  }
+  on self::G<core::int> catch(final self::G<core::int> e) {
+  }
+}
+static method t1b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t2b() → dynamic {
+  try {
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method t3b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t4b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t5b() → dynamic {
+  try {
+  }
+  on self::ConcreteClass catch(final self::ConcreteClass e) {
+  }
+}
+static method t6b() → dynamic {
+  try {
+  }
+  on self::Class<self::ConcreteClass> catch(final self::Class<self::ConcreteClass> e) {
+  }
+}
+static method t7b() → dynamic {
+  try {
+  }
+  on core::Object catch(final core::Object e) {
+  }
+}
+static method t8b() → dynamic {
+  try {
+  }
+  on core::int catch(final core::int e) {
+  }
+}
+static method s1b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s2b() → dynamic {
+  try {
+  }
+  on self::G<dynamic> catch(final self::G<dynamic> e) {
+  }
+}
+static method s3b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s4b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s5b() → dynamic {
+  try {
+  }
+  on self::G<self::ConcreteClass> catch(final self::G<self::ConcreteClass> e) {
+  }
+}
+static method s6b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<self::ConcreteClass>> catch(final self::G<self::Class<self::ConcreteClass>> e) {
+  }
+}
+static method s7b() → dynamic {
+  try {
+  }
+  on self::G<core::Object> catch(final self::G<core::Object> e) {
+  }
+}
+static method s8b() → dynamic {
+  try {
+  }
+  on self::G<core::int> catch(final self::G<core::int> e) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_catch.dart.weak.modular.expect
new file mode 100644
index 0000000..d56af17
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart.weak.modular.expect
@@ -0,0 +1,292 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_catch.dart:50:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:56:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:98:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:104:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:146:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:152:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:194:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:200:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method t1a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t2a() → dynamic {
+  try {
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method t3a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t4a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t5a() → dynamic {
+  try {
+  }
+  on self::ConcreteClass catch(final self::ConcreteClass e) {
+  }
+}
+static method t6a() → dynamic {
+  try {
+  }
+  on self::Class<self::ConcreteClass> catch(final self::Class<self::ConcreteClass> e) {
+  }
+}
+static method t7a() → dynamic {
+  try {
+  }
+  on core::Object catch(final core::Object e) {
+  }
+}
+static method t8a() → dynamic {
+  try {
+  }
+  on core::int catch(final core::int e) {
+  }
+}
+static method s1a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s2a() → dynamic {
+  try {
+  }
+  on self::G<dynamic> catch(final self::G<dynamic> e) {
+  }
+}
+static method s3a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s4a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s5a() → dynamic {
+  try {
+  }
+  on self::G<self::ConcreteClass> catch(final self::G<self::ConcreteClass> e) {
+  }
+}
+static method s6a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<self::ConcreteClass>> catch(final self::G<self::Class<self::ConcreteClass>> e) {
+  }
+}
+static method s7a() → dynamic {
+  try {
+  }
+  on self::G<core::Object> catch(final self::G<core::Object> e) {
+  }
+}
+static method s8a() → dynamic {
+  try {
+  }
+  on self::G<core::int> catch(final self::G<core::int> e) {
+  }
+}
+static method t1b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t2b() → dynamic {
+  try {
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method t3b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t4b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t5b() → dynamic {
+  try {
+  }
+  on self::ConcreteClass catch(final self::ConcreteClass e) {
+  }
+}
+static method t6b() → dynamic {
+  try {
+  }
+  on self::Class<self::ConcreteClass> catch(final self::Class<self::ConcreteClass> e) {
+  }
+}
+static method t7b() → dynamic {
+  try {
+  }
+  on core::Object catch(final core::Object e) {
+  }
+}
+static method t8b() → dynamic {
+  try {
+  }
+  on core::int catch(final core::int e) {
+  }
+}
+static method s1b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s2b() → dynamic {
+  try {
+  }
+  on self::G<dynamic> catch(final self::G<dynamic> e) {
+  }
+}
+static method s3b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s4b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s5b() → dynamic {
+  try {
+  }
+  on self::G<self::ConcreteClass> catch(final self::G<self::ConcreteClass> e) {
+  }
+}
+static method s6b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<self::ConcreteClass>> catch(final self::G<self::Class<self::ConcreteClass>> e) {
+  }
+}
+static method s7b() → dynamic {
+  try {
+  }
+  on self::G<core::Object> catch(final self::G<core::Object> e) {
+  }
+}
+static method s8b() → dynamic {
+  try {
+  }
+  on self::G<core::int> catch(final self::G<core::int> e) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_catch.dart.weak.outline.expect
new file mode 100644
index 0000000..1bd5e4a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart.weak.outline.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+static method t1a() → dynamic
+  ;
+static method t2a() → dynamic
+  ;
+static method t3a() → dynamic
+  ;
+static method t4a() → dynamic
+  ;
+static method t5a() → dynamic
+  ;
+static method t6a() → dynamic
+  ;
+static method t7a() → dynamic
+  ;
+static method t8a() → dynamic
+  ;
+static method s1a() → dynamic
+  ;
+static method s2a() → dynamic
+  ;
+static method s3a() → dynamic
+  ;
+static method s4a() → dynamic
+  ;
+static method s5a() → dynamic
+  ;
+static method s6a() → dynamic
+  ;
+static method s7a() → dynamic
+  ;
+static method s8a() → dynamic
+  ;
+static method t1b() → dynamic
+  ;
+static method t2b() → dynamic
+  ;
+static method t3b() → dynamic
+  ;
+static method t4b() → dynamic
+  ;
+static method t5b() → dynamic
+  ;
+static method t6b() → dynamic
+  ;
+static method t7b() → dynamic
+  ;
+static method t8b() → dynamic
+  ;
+static method s1b() → dynamic
+  ;
+static method s2b() → dynamic
+  ;
+static method s3b() → dynamic
+  ;
+static method s4b() → dynamic
+  ;
+static method s5b() → dynamic
+  ;
+static method s6b() → dynamic
+  ;
+static method s7b() → dynamic
+  ;
+static method s8b() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_catch.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_catch.dart.weak.transformed.expect
new file mode 100644
index 0000000..d56af17
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_catch.dart.weak.transformed.expect
@@ -0,0 +1,292 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_catch.dart:50:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:56:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:98:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:104:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:146:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:152:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on F<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:194:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<Object> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.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_catch.dart:200:13: 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_catch.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   try {} on G<int> catch (e) {
+//             ^
+// pkg/front_end/testcases/general/bounds_catch.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method t1a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t2a() → dynamic {
+  try {
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method t3a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t4a() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t5a() → dynamic {
+  try {
+  }
+  on self::ConcreteClass catch(final self::ConcreteClass e) {
+  }
+}
+static method t6a() → dynamic {
+  try {
+  }
+  on self::Class<self::ConcreteClass> catch(final self::Class<self::ConcreteClass> e) {
+  }
+}
+static method t7a() → dynamic {
+  try {
+  }
+  on core::Object catch(final core::Object e) {
+  }
+}
+static method t8a() → dynamic {
+  try {
+  }
+  on core::int catch(final core::int e) {
+  }
+}
+static method s1a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s2a() → dynamic {
+  try {
+  }
+  on self::G<dynamic> catch(final self::G<dynamic> e) {
+  }
+}
+static method s3a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s4a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s5a() → dynamic {
+  try {
+  }
+  on self::G<self::ConcreteClass> catch(final self::G<self::ConcreteClass> e) {
+  }
+}
+static method s6a() → dynamic {
+  try {
+  }
+  on self::G<self::Class<self::ConcreteClass>> catch(final self::G<self::Class<self::ConcreteClass>> e) {
+  }
+}
+static method s7a() → dynamic {
+  try {
+  }
+  on self::G<core::Object> catch(final self::G<core::Object> e) {
+  }
+}
+static method s8a() → dynamic {
+  try {
+  }
+  on self::G<core::int> catch(final self::G<core::int> e) {
+  }
+}
+static method t1b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t2b() → dynamic {
+  try {
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method t3b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t4b() → dynamic {
+  try {
+  }
+  on self::Class<dynamic> catch(final self::Class<dynamic> e) {
+  }
+}
+static method t5b() → dynamic {
+  try {
+  }
+  on self::ConcreteClass catch(final self::ConcreteClass e) {
+  }
+}
+static method t6b() → dynamic {
+  try {
+  }
+  on self::Class<self::ConcreteClass> catch(final self::Class<self::ConcreteClass> e) {
+  }
+}
+static method t7b() → dynamic {
+  try {
+  }
+  on core::Object catch(final core::Object e) {
+  }
+}
+static method t8b() → dynamic {
+  try {
+  }
+  on core::int catch(final core::int e) {
+  }
+}
+static method s1b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s2b() → dynamic {
+  try {
+  }
+  on self::G<dynamic> catch(final self::G<dynamic> e) {
+  }
+}
+static method s3b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s4b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<dynamic>> catch(final self::G<self::Class<dynamic>> e) {
+  }
+}
+static method s5b() → dynamic {
+  try {
+  }
+  on self::G<self::ConcreteClass> catch(final self::G<self::ConcreteClass> e) {
+  }
+}
+static method s6b() → dynamic {
+  try {
+  }
+  on self::G<self::Class<self::ConcreteClass>> catch(final self::G<self::Class<self::ConcreteClass>> e) {
+  }
+}
+static method s7b() → dynamic {
+  try {
+  }
+  on self::G<core::Object> catch(final self::G<core::Object> e) {
+  }
+}
+static method s8b() → dynamic {
+  try {
+  }
+  on self::G<core::int> catch(final self::G<core::int> e) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect
index 3cebc8b..3b587bb 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:32: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
-//                                        ^
+//                                ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:61: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
-//                  ^
+//                                                             ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect
index 3cebc8b..3b587bb 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:32: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
-//                                        ^
+//                                ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:61: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
-//                  ^
+//                                                             ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect
index d778825..9a4c7c1 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.outline.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:32: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
-//                                        ^
+//                                ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:61: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
-//                  ^
+//                                                             ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect
index 3cebc8b..3b587bb 100644
--- a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.transformed.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:32: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
-//                                        ^
+//                                ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
 //
-// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:61: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
-//                  ^
+//                                                             ^
 // pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends String> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart b/pkg/front_end/testcases/general/bounds_enums.dart
new file mode 100644
index 0000000..d773c42
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, 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.
+
+// TODO(johnniwinther): Check/create this type as regular bounded i2b.
+
+typedef A<X> = X Function(X);
+
+class B<X> {}
+
+enum E1<Y extends A<Y>> /* Error */ {
+  e1<Never>() // Ok
+}
+
+enum E2<Y extends B<Y>> /* Error */ {
+  e2<Never>() // Ok
+}
+
+enum E3<Y extends E3<Y>> /* Error */ {
+  e3<Never>() // Ok
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_enums.dart.textual_outline.expect
new file mode 100644
index 0000000..1fb4a64
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+typedef A<X> = X Function(X);
+
+class B<X> {}
+
+enum E1<Y extends A<Y>> { e1<Never>() }
+
+enum E2<Y extends B<Y>> { e2<Never>() }
+
+enum E3<Y extends E3<Y>> { e3<Never>() }
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_enums.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2dba339
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+class B<X> {}
+
+enum E1<Y extends A<Y>> { e1<Never>() }
+
+enum E2<Y extends B<Y>> { e2<Never>() }
+
+enum E3<Y extends E3<Y>> { e3<Never>() }
+
+main() {}
+typedef A<X> = X Function(X);
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart.weak.expect b/pkg/front_end/testcases/general/bounds_enums.dart.weak.expect
new file mode 100644
index 0000000..0ac15942
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart.weak.expect
@@ -0,0 +1,75 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'Y Function(Y)' of the type variable 'Y' on 'E1'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// enum E1<Y extends A<Y>> /* Error */ {
+//         ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Context: If you want 'E1<A<dynamic>>' to be a super-bounded type, note that the inverted type 'E1<A<Never>>' must then satisfy its bounds, which it does not.
+//  - 'E1' is from 'pkg/front_end/testcases/general/bounds_enums.dart'.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+class E1<Y extends (self::E1::Y) → self::E1::Y = (dynamic) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1<(dynamic) → dynamic>> values = #C4;
+  static const field self::E1<Never> e1 = #C3;
+  const constructor •(core::int index, core::String name) → self::E1<self::E1::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<Y extends self::B<self::E2::Y> = self::B<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<self::B<dynamic>>> values = #C7;
+  static const field self::E2<Never> e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E2<self::E2::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3<Y extends self::E3<self::E3::Y> = self::E3<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<self::E3<dynamic>>> values = #C10;
+  static const field self::E3<Never> e3 = #C9;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E1<Never*> {index:#C1, _name:#C2}
+  #C4 = <self::E1<dynamic>*>[#C3]
+  #C5 = "e2"
+  #C6 = self::E2<Never*> {index:#C1, _name:#C5}
+  #C7 = <self::E2<dynamic>*>[#C6]
+  #C8 = "e3"
+  #C9 = self::E3<Never*> {index:#C1, _name:#C8}
+  #C10 = <self::E3<dynamic>*>[#C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_enums.dart:
+- E1. (from org-dartlang-testcase:///bounds_enums.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///bounds_enums.dart:15:6)
+- E3. (from org-dartlang-testcase:///bounds_enums.dart:19:6)
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_enums.dart.weak.modular.expect
new file mode 100644
index 0000000..0ac15942
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'Y Function(Y)' of the type variable 'Y' on 'E1'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// enum E1<Y extends A<Y>> /* Error */ {
+//         ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Context: If you want 'E1<A<dynamic>>' to be a super-bounded type, note that the inverted type 'E1<A<Never>>' must then satisfy its bounds, which it does not.
+//  - 'E1' is from 'pkg/front_end/testcases/general/bounds_enums.dart'.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+class E1<Y extends (self::E1::Y) → self::E1::Y = (dynamic) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1<(dynamic) → dynamic>> values = #C4;
+  static const field self::E1<Never> e1 = #C3;
+  const constructor •(core::int index, core::String name) → self::E1<self::E1::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<Y extends self::B<self::E2::Y> = self::B<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<self::B<dynamic>>> values = #C7;
+  static const field self::E2<Never> e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E2<self::E2::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3<Y extends self::E3<self::E3::Y> = self::E3<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<self::E3<dynamic>>> values = #C10;
+  static const field self::E3<Never> e3 = #C9;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E1<Never*> {index:#C1, _name:#C2}
+  #C4 = <self::E1<dynamic>*>[#C3]
+  #C5 = "e2"
+  #C6 = self::E2<Never*> {index:#C1, _name:#C5}
+  #C7 = <self::E2<dynamic>*>[#C6]
+  #C8 = "e3"
+  #C9 = self::E3<Never*> {index:#C1, _name:#C8}
+  #C10 = <self::E3<dynamic>*>[#C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_enums.dart:
+- E1. (from org-dartlang-testcase:///bounds_enums.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///bounds_enums.dart:15:6)
+- E3. (from org-dartlang-testcase:///bounds_enums.dart:19:6)
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_enums.dart.weak.outline.expect
new file mode 100644
index 0000000..8034688
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart.weak.outline.expect
@@ -0,0 +1,63 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'Y Function(Y)' of the type variable 'Y' on 'E1'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// enum E1<Y extends A<Y>> /* Error */ {
+//         ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Context: If you want 'E1<A<dynamic>>' to be a super-bounded type, note that the inverted type 'E1<A<Never>>' must then satisfy its bounds, which it does not.
+//  - 'E1' is from 'pkg/front_end/testcases/general/bounds_enums.dart'.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    ;
+}
+class E1<Y extends (self::E1::Y) → self::E1::Y = (dynamic) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1<(dynamic) → dynamic>> values = const <self::E1<dynamic>>[self::E1::e1];
+  static const field self::E1<Never> e1 = const self::E1::•<Never>(0, "e1");
+  const constructor •(core::int index, core::String name) → self::E1<self::E1::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<Y extends self::B<self::E2::Y> = self::B<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<self::B<dynamic>>> values = const <self::E2<dynamic>>[self::E2::e2];
+  static const field self::E2<Never> e2 = const self::E2::•<Never>(0, "e2");
+  const constructor •(core::int index, core::String name) → self::E2<self::E2::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3<Y extends self::E3<self::E3::Y> = self::E3<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<self::E3<dynamic>>> values = const <self::E3<dynamic>>[self::E3::e3];
+  static const field self::E3<Never> e3 = const self::E3::•<Never>(0, "e3");
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_enums.dart:11:6 -> ListConstant(const <E1<dynamic>*>[const E1<Never*>{_Enum.index: 0, _Enum._name: "e1"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_enums.dart:12:3 -> InstanceConstant(const E1<Never*>{_Enum.index: 0, _Enum._name: "e1"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_enums.dart:15:6 -> ListConstant(const <E2<dynamic>*>[const E2<Never*>{_Enum.index: 0, _Enum._name: "e2"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_enums.dart:16:3 -> InstanceConstant(const E2<Never*>{_Enum.index: 0, _Enum._name: "e2"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_enums.dart:19:6 -> ListConstant(const <E3<dynamic>*>[const E3<Never*>{_Enum.index: 0, _Enum._name: "e3"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_enums.dart:20:3 -> InstanceConstant(const E3<Never*>{_Enum.index: 0, _Enum._name: "e3"})
+Extra constant evaluation: evaluated: 21, effectively constant: 6
diff --git a/pkg/front_end/testcases/general/bounds_enums.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_enums.dart.weak.transformed.expect
new file mode 100644
index 0000000..0ac15942
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_enums.dart.weak.transformed.expect
@@ -0,0 +1,75 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'Y Function(Y)' of the type variable 'Y' on 'E1'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// enum E1<Y extends A<Y>> /* Error */ {
+//         ^
+// pkg/front_end/testcases/general/bounds_enums.dart:11:6: Context: If you want 'E1<A<dynamic>>' to be a super-bounded type, note that the inverted type 'E1<A<Never>>' must then satisfy its bounds, which it does not.
+//  - 'E1' is from 'pkg/front_end/testcases/general/bounds_enums.dart'.
+// enum E1<Y extends A<Y>> /* Error */ {
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+class E1<Y extends (self::E1::Y) → self::E1::Y = (dynamic) → dynamic> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1<(dynamic) → dynamic>> values = #C4;
+  static const field self::E1<Never> e1 = #C3;
+  const constructor •(core::int index, core::String name) → self::E1<self::E1::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2<Y extends self::B<self::E2::Y> = self::B<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2<self::B<dynamic>>> values = #C7;
+  static const field self::E2<Never> e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::E2<self::E2::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+class E3<Y extends self::E3<self::E3::Y> = self::E3<dynamic>> extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3<self::E3<dynamic>>> values = #C10;
+  static const field self::E3<Never> e3 = #C9;
+  const constructor •(core::int index, core::String name) → self::E3<self::E3::Y>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::E1<Never*> {index:#C1, _name:#C2}
+  #C4 = <self::E1<dynamic>*>[#C3]
+  #C5 = "e2"
+  #C6 = self::E2<Never*> {index:#C1, _name:#C5}
+  #C7 = <self::E2<dynamic>*>[#C6]
+  #C8 = "e3"
+  #C9 = self::E3<Never*> {index:#C1, _name:#C8}
+  #C10 = <self::E3<dynamic>*>[#C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_enums.dart:
+- E1. (from org-dartlang-testcase:///bounds_enums.dart:11:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///bounds_enums.dart:15:6)
+- E3. (from org-dartlang-testcase:///bounds_enums.dart:19:6)
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart b/pkg/front_end/testcases/general/bounds_fields.dart
new file mode 100644
index 0000000..b840fce
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+F? field1a, field1b; // Ok
+F<dynamic>? field2a, field2b; // Ok
+F<Class>? field3a, field3b; // Ok
+F<Class<dynamic>>? field4a, field4b; // Ok
+F<ConcreteClass>? field5a, field5b; // Ok
+F<Class<ConcreteClass>>? field6a, field6b; // Ok
+F<Object>? field7a, field7b; // Error
+F<int>? field8a, field8b; // Error
+G? field1c, field1d; // Ok
+G<dynamic>? field2c, field2d; // Ok
+G<Class>? field3c, field3d; // Ok
+G<Class<dynamic>>? field4c, field4d; // Ok
+G<ConcreteClass>? field5c, field5d; // Ok
+G<Class<ConcreteClass>>? field6c, field6d; // Ok
+G<Object>? field7c, field8d; // Error
+G<int>? field8c, field7d; // Error
+
+class Class1 {
+  F? field1a, field1b; // Ok
+  F<dynamic>? field2a, field2b; // Ok
+  F<Class>? field3a, field3b; // Ok
+  F<Class<dynamic>>? field4a, field4b; // Ok
+  F<ConcreteClass>? field5a, field5b; // Ok
+  F<Class<ConcreteClass>>? field6a, field6b; // Ok
+  F<Object>? field7a, field7b; // Error
+  F<int>? field8a, field8b; // Error
+  G? field1c, field1d; // Ok
+  G<dynamic>? field2c, field2d; // Ok
+  G<Class>? field3c, field3d; // Ok
+  G<Class<dynamic>>? field4c, field4d; // Ok
+  G<ConcreteClass>? field5c, field5d; // Ok
+  G<Class<ConcreteClass>>? field6c, field6d; // Ok
+  G<Object>? field7c, field8d; // Error
+  G<int>? field8c, field7d; // Error
+}
+
+extension Extension1 on int {
+  static F? field1a, field1b; // Ok
+  static F<dynamic>? field2a, field2b; // Ok
+  static F<Class>? field3a, field3b; // Ok
+  static F<Class<dynamic>>? field4a, field4b; // Ok
+  static F<ConcreteClass>? field5a, field5b; // Ok
+  static F<Class<ConcreteClass>>? field6a, field6b; // Ok
+  static F<Object>? field7a, field7b; // Error
+  static F<int>? field8a, field8b; // Error
+  static G? field1c, field1d; // Ok
+  static G<dynamic>? field2c, field2d; // Ok
+  static G<Class>? field3c, field3d; // Ok
+  static G<Class<dynamic>>? field4c, field4d; // Ok
+  static G<ConcreteClass>? field5c, field5d; // Ok
+  static G<Class<ConcreteClass>>? field6c, field6d; // Ok
+  static G<Object>? field7c, field8d; // Error
+  static G<int>? field8c, field7d; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_fields.dart.textual_outline.expect
new file mode 100644
index 0000000..827a05b
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart.textual_outline.expect
@@ -0,0 +1,64 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+F? field1a, field1b;
+F<dynamic>? field2a, field2b;
+F<Class>? field3a, field3b;
+F<Class<dynamic>>? field4a, field4b;
+F<ConcreteClass>? field5a, field5b;
+F<Class<ConcreteClass>>? field6a, field6b;
+F<Object>? field7a, field7b;
+F<int>? field8a, field8b;
+G? field1c, field1d;
+G<dynamic>? field2c, field2d;
+G<Class>? field3c, field3d;
+G<Class<dynamic>>? field4c, field4d;
+G<ConcreteClass>? field5c, field5d;
+G<Class<ConcreteClass>>? field6c, field6d;
+G<Object>? field7c, field8d;
+G<int>? field8c, field7d;
+
+class Class1 {
+  F? field1a, field1b;
+  F<dynamic>? field2a, field2b;
+  F<Class>? field3a, field3b;
+  F<Class<dynamic>>? field4a, field4b;
+  F<ConcreteClass>? field5a, field5b;
+  F<Class<ConcreteClass>>? field6a, field6b;
+  F<Object>? field7a, field7b;
+  F<int>? field8a, field8b;
+  G? field1c, field1d;
+  G<dynamic>? field2c, field2d;
+  G<Class>? field3c, field3d;
+  G<Class<dynamic>>? field4c, field4d;
+  G<ConcreteClass>? field5c, field5d;
+  G<Class<ConcreteClass>>? field6c, field6d;
+  G<Object>? field7c, field8d;
+  G<int>? field8c, field7d;
+}
+
+extension Extension1 on int {
+  static F? field1a, field1b;
+  static F<dynamic>? field2a, field2b;
+  static F<Class>? field3a, field3b;
+  static F<Class<dynamic>>? field4a, field4b;
+  static F<ConcreteClass>? field5a, field5b;
+  static F<Class<ConcreteClass>>? field6a, field6b;
+  static F<Object>? field7a, field7b;
+  static F<int>? field8a, field8b;
+  static G? field1c, field1d;
+  static G<dynamic>? field2c, field2d;
+  static G<Class>? field3c, field3d;
+  static G<Class<dynamic>>? field4c, field4d;
+  static G<ConcreteClass>? field5c, field5d;
+  static G<Class<ConcreteClass>>? field6c, field6d;
+  static G<Object>? field7c, field8d;
+  static G<int>? field8c, field7d;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_fields.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..064b48e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart.textual_outline_modelled.expect
@@ -0,0 +1,63 @@
+F<Class<ConcreteClass>>? field6a, field6b;
+F<Class<dynamic>>? field4a, field4b;
+F<Class>? field3a, field3b;
+F<ConcreteClass>? field5a, field5b;
+F<Object>? field7a, field7b;
+F<dynamic>? field2a, field2b;
+F<int>? field8a, field8b;
+F? field1a, field1b;
+G<Class<ConcreteClass>>? field6c, field6d;
+G<Class<dynamic>>? field4c, field4d;
+G<Class>? field3c, field3d;
+G<ConcreteClass>? field5c, field5d;
+G<Object>? field7c, field8d;
+G<dynamic>? field2c, field2d;
+G<int>? field8c, field7d;
+G? field1c, field1d;
+
+class Class<T> {}
+
+class Class1 {
+  F<Class<ConcreteClass>>? field6a, field6b;
+  F<Class<dynamic>>? field4a, field4b;
+  F<Class>? field3a, field3b;
+  F<ConcreteClass>? field5a, field5b;
+  F<Object>? field7a, field7b;
+  F<dynamic>? field2a, field2b;
+  F<int>? field8a, field8b;
+  F? field1a, field1b;
+  G<Class<ConcreteClass>>? field6c, field6d;
+  G<Class<dynamic>>? field4c, field4d;
+  G<Class>? field3c, field3d;
+  G<ConcreteClass>? field5c, field5d;
+  G<Object>? field7c, field8d;
+  G<dynamic>? field2c, field2d;
+  G<int>? field8c, field7d;
+  G? field1c, field1d;
+}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+extension Extension1 on int {
+  static F<Class<ConcreteClass>>? field6a, field6b;
+  static F<Class<dynamic>>? field4a, field4b;
+  static F<Class>? field3a, field3b;
+  static F<ConcreteClass>? field5a, field5b;
+  static F<Object>? field7a, field7b;
+  static F<dynamic>? field2a, field2b;
+  static F<int>? field8a, field8b;
+  static F? field1a, field1b;
+  static G<Class<ConcreteClass>>? field6c, field6d;
+  static G<Class<dynamic>>? field4c, field4d;
+  static G<Class>? field3c, field3d;
+  static G<ConcreteClass>? field5c, field5d;
+  static G<Object>? field7c, field8d;
+  static G<dynamic>? field2c, field2d;
+  static G<int>? field8c, field7d;
+  static G? field1c, field1d;
+}
+
+main() {}
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart.weak.expect b/pkg/front_end/testcases/general/bounds_fields.dart.weak.expect
new file mode 100644
index 0000000..19cb0c7
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart.weak.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_fields.dart:19:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object>? field7a, field7b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:20:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int>? field8a, field8b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:27:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object>? field7c, field8d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:28:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int>? field8c, field7d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:37:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>? field7a, field7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:38:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>? field8a, field8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:45:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>? field7c, field8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:46:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>? field8c, field7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:56:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<Object>? field7a, field7b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:57:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<int>? field8a, field8b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:64:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<Object>? field7c, field8d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:65:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<int>? field8c, field7d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  field self::Class<dynamic>? field1a = null;
+  field self::Class<dynamic>? field1b = null;
+  field dynamic field2a = null;
+  field dynamic field2b = null;
+  field self::Class<dynamic>? field3a = null;
+  field self::Class<dynamic>? field3b = null;
+  field self::Class<dynamic>? field4a = null;
+  field self::Class<dynamic>? field4b = null;
+  field self::ConcreteClass? field5a = null;
+  field self::ConcreteClass? field5b = null;
+  field self::Class<self::ConcreteClass>? field6a = null;
+  field self::Class<self::ConcreteClass>? field6b = null;
+  field core::Object? field7a = null;
+  field core::Object? field7b = null;
+  field core::int? field8a = null;
+  field core::int? field8b = null;
+  field self::G<self::Class<dynamic>>? field1c = null;
+  field self::G<self::Class<dynamic>>? field1d = null;
+  field self::G<dynamic>? field2c = null;
+  field self::G<dynamic>? field2d = null;
+  field self::G<self::Class<dynamic>>? field3c = null;
+  field self::G<self::Class<dynamic>>? field3d = null;
+  field self::G<self::Class<dynamic>>? field4c = null;
+  field self::G<self::Class<dynamic>>? field4d = null;
+  field self::G<self::ConcreteClass>? field5c = null;
+  field self::G<self::ConcreteClass>? field5d = null;
+  field self::G<self::Class<self::ConcreteClass>>? field6c = null;
+  field self::G<self::Class<self::ConcreteClass>>? field6d = null;
+  field self::G<core::Object>? field7c = null;
+  field self::G<core::Object>? field8d = null;
+  field self::G<core::int>? field8c = null;
+  field self::G<core::int>? field7d = null;
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+extension Extension1 on core::int {
+  static field field1a = self::Extension1|field1a;
+  static field field1b = self::Extension1|field1b;
+  static field field2a = self::Extension1|field2a;
+  static field field2b = self::Extension1|field2b;
+  static field field3a = self::Extension1|field3a;
+  static field field3b = self::Extension1|field3b;
+  static field field4a = self::Extension1|field4a;
+  static field field4b = self::Extension1|field4b;
+  static field field5a = self::Extension1|field5a;
+  static field field5b = self::Extension1|field5b;
+  static field field6a = self::Extension1|field6a;
+  static field field6b = self::Extension1|field6b;
+  static field field7a = self::Extension1|field7a;
+  static field field7b = self::Extension1|field7b;
+  static field field8a = self::Extension1|field8a;
+  static field field8b = self::Extension1|field8b;
+  static field field1c = self::Extension1|field1c;
+  static field field1d = self::Extension1|field1d;
+  static field field2c = self::Extension1|field2c;
+  static field field2d = self::Extension1|field2d;
+  static field field3c = self::Extension1|field3c;
+  static field field3d = self::Extension1|field3d;
+  static field field4c = self::Extension1|field4c;
+  static field field4d = self::Extension1|field4d;
+  static field field5c = self::Extension1|field5c;
+  static field field5d = self::Extension1|field5d;
+  static field field6c = self::Extension1|field6c;
+  static field field6d = self::Extension1|field6d;
+  static field field7c = self::Extension1|field7c;
+  static field field8d = self::Extension1|field8d;
+  static field field8c = self::Extension1|field8c;
+  static field field7d = self::Extension1|field7d;
+}
+static field self::Class<dynamic>? field1a;
+static field self::Class<dynamic>? field1b;
+static field dynamic field2a;
+static field dynamic field2b;
+static field self::Class<dynamic>? field3a;
+static field self::Class<dynamic>? field3b;
+static field self::Class<dynamic>? field4a;
+static field self::Class<dynamic>? field4b;
+static field self::ConcreteClass? field5a;
+static field self::ConcreteClass? field5b;
+static field self::Class<self::ConcreteClass>? field6a;
+static field self::Class<self::ConcreteClass>? field6b;
+static field core::Object? field7a;
+static field core::Object? field7b;
+static field core::int? field8a;
+static field core::int? field8b;
+static field self::G<self::Class<dynamic>>? field1c;
+static field self::G<self::Class<dynamic>>? field1d;
+static field self::G<dynamic>? field2c;
+static field self::G<dynamic>? field2d;
+static field self::G<self::Class<dynamic>>? field3c;
+static field self::G<self::Class<dynamic>>? field3d;
+static field self::G<self::Class<dynamic>>? field4c;
+static field self::G<self::Class<dynamic>>? field4d;
+static field self::G<self::ConcreteClass>? field5c;
+static field self::G<self::ConcreteClass>? field5d;
+static field self::G<self::Class<self::ConcreteClass>>? field6c;
+static field self::G<self::Class<self::ConcreteClass>>? field6d;
+static field self::G<core::Object>? field7c;
+static field self::G<core::Object>? field8d;
+static field self::G<core::int>? field8c;
+static field self::G<core::int>? field7d;
+static field self::Class<dynamic>? Extension1|field1a;
+static field self::Class<dynamic>? Extension1|field1b;
+static field dynamic Extension1|field2a;
+static field dynamic Extension1|field2b;
+static field self::Class<dynamic>? Extension1|field3a;
+static field self::Class<dynamic>? Extension1|field3b;
+static field self::Class<dynamic>? Extension1|field4a;
+static field self::Class<dynamic>? Extension1|field4b;
+static field self::ConcreteClass? Extension1|field5a;
+static field self::ConcreteClass? Extension1|field5b;
+static field self::Class<self::ConcreteClass>? Extension1|field6a;
+static field self::Class<self::ConcreteClass>? Extension1|field6b;
+static field core::Object? Extension1|field7a;
+static field core::Object? Extension1|field7b;
+static field core::int? Extension1|field8a;
+static field core::int? Extension1|field8b;
+static field self::G<self::Class<dynamic>>? Extension1|field1c;
+static field self::G<self::Class<dynamic>>? Extension1|field1d;
+static field self::G<dynamic>? Extension1|field2c;
+static field self::G<dynamic>? Extension1|field2d;
+static field self::G<self::Class<dynamic>>? Extension1|field3c;
+static field self::G<self::Class<dynamic>>? Extension1|field3d;
+static field self::G<self::Class<dynamic>>? Extension1|field4c;
+static field self::G<self::Class<dynamic>>? Extension1|field4d;
+static field self::G<self::ConcreteClass>? Extension1|field5c;
+static field self::G<self::ConcreteClass>? Extension1|field5d;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6c;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6d;
+static field self::G<core::Object>? Extension1|field7c;
+static field self::G<core::Object>? Extension1|field8d;
+static field self::G<core::int>? Extension1|field8c;
+static field self::G<core::int>? Extension1|field7d;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..19cb0c7
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart.weak.modular.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_fields.dart:19:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object>? field7a, field7b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:20:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int>? field8a, field8b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:27:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object>? field7c, field8d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:28:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int>? field8c, field7d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:37:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>? field7a, field7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:38:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>? field8a, field8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:45:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>? field7c, field8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:46:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>? field8c, field7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:56:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<Object>? field7a, field7b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:57:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<int>? field8a, field8b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:64:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<Object>? field7c, field8d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:65:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<int>? field8c, field7d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  field self::Class<dynamic>? field1a = null;
+  field self::Class<dynamic>? field1b = null;
+  field dynamic field2a = null;
+  field dynamic field2b = null;
+  field self::Class<dynamic>? field3a = null;
+  field self::Class<dynamic>? field3b = null;
+  field self::Class<dynamic>? field4a = null;
+  field self::Class<dynamic>? field4b = null;
+  field self::ConcreteClass? field5a = null;
+  field self::ConcreteClass? field5b = null;
+  field self::Class<self::ConcreteClass>? field6a = null;
+  field self::Class<self::ConcreteClass>? field6b = null;
+  field core::Object? field7a = null;
+  field core::Object? field7b = null;
+  field core::int? field8a = null;
+  field core::int? field8b = null;
+  field self::G<self::Class<dynamic>>? field1c = null;
+  field self::G<self::Class<dynamic>>? field1d = null;
+  field self::G<dynamic>? field2c = null;
+  field self::G<dynamic>? field2d = null;
+  field self::G<self::Class<dynamic>>? field3c = null;
+  field self::G<self::Class<dynamic>>? field3d = null;
+  field self::G<self::Class<dynamic>>? field4c = null;
+  field self::G<self::Class<dynamic>>? field4d = null;
+  field self::G<self::ConcreteClass>? field5c = null;
+  field self::G<self::ConcreteClass>? field5d = null;
+  field self::G<self::Class<self::ConcreteClass>>? field6c = null;
+  field self::G<self::Class<self::ConcreteClass>>? field6d = null;
+  field self::G<core::Object>? field7c = null;
+  field self::G<core::Object>? field8d = null;
+  field self::G<core::int>? field8c = null;
+  field self::G<core::int>? field7d = null;
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+extension Extension1 on core::int {
+  static field field1a = self::Extension1|field1a;
+  static field field1b = self::Extension1|field1b;
+  static field field2a = self::Extension1|field2a;
+  static field field2b = self::Extension1|field2b;
+  static field field3a = self::Extension1|field3a;
+  static field field3b = self::Extension1|field3b;
+  static field field4a = self::Extension1|field4a;
+  static field field4b = self::Extension1|field4b;
+  static field field5a = self::Extension1|field5a;
+  static field field5b = self::Extension1|field5b;
+  static field field6a = self::Extension1|field6a;
+  static field field6b = self::Extension1|field6b;
+  static field field7a = self::Extension1|field7a;
+  static field field7b = self::Extension1|field7b;
+  static field field8a = self::Extension1|field8a;
+  static field field8b = self::Extension1|field8b;
+  static field field1c = self::Extension1|field1c;
+  static field field1d = self::Extension1|field1d;
+  static field field2c = self::Extension1|field2c;
+  static field field2d = self::Extension1|field2d;
+  static field field3c = self::Extension1|field3c;
+  static field field3d = self::Extension1|field3d;
+  static field field4c = self::Extension1|field4c;
+  static field field4d = self::Extension1|field4d;
+  static field field5c = self::Extension1|field5c;
+  static field field5d = self::Extension1|field5d;
+  static field field6c = self::Extension1|field6c;
+  static field field6d = self::Extension1|field6d;
+  static field field7c = self::Extension1|field7c;
+  static field field8d = self::Extension1|field8d;
+  static field field8c = self::Extension1|field8c;
+  static field field7d = self::Extension1|field7d;
+}
+static field self::Class<dynamic>? field1a;
+static field self::Class<dynamic>? field1b;
+static field dynamic field2a;
+static field dynamic field2b;
+static field self::Class<dynamic>? field3a;
+static field self::Class<dynamic>? field3b;
+static field self::Class<dynamic>? field4a;
+static field self::Class<dynamic>? field4b;
+static field self::ConcreteClass? field5a;
+static field self::ConcreteClass? field5b;
+static field self::Class<self::ConcreteClass>? field6a;
+static field self::Class<self::ConcreteClass>? field6b;
+static field core::Object? field7a;
+static field core::Object? field7b;
+static field core::int? field8a;
+static field core::int? field8b;
+static field self::G<self::Class<dynamic>>? field1c;
+static field self::G<self::Class<dynamic>>? field1d;
+static field self::G<dynamic>? field2c;
+static field self::G<dynamic>? field2d;
+static field self::G<self::Class<dynamic>>? field3c;
+static field self::G<self::Class<dynamic>>? field3d;
+static field self::G<self::Class<dynamic>>? field4c;
+static field self::G<self::Class<dynamic>>? field4d;
+static field self::G<self::ConcreteClass>? field5c;
+static field self::G<self::ConcreteClass>? field5d;
+static field self::G<self::Class<self::ConcreteClass>>? field6c;
+static field self::G<self::Class<self::ConcreteClass>>? field6d;
+static field self::G<core::Object>? field7c;
+static field self::G<core::Object>? field8d;
+static field self::G<core::int>? field8c;
+static field self::G<core::int>? field7d;
+static field self::Class<dynamic>? Extension1|field1a;
+static field self::Class<dynamic>? Extension1|field1b;
+static field dynamic Extension1|field2a;
+static field dynamic Extension1|field2b;
+static field self::Class<dynamic>? Extension1|field3a;
+static field self::Class<dynamic>? Extension1|field3b;
+static field self::Class<dynamic>? Extension1|field4a;
+static field self::Class<dynamic>? Extension1|field4b;
+static field self::ConcreteClass? Extension1|field5a;
+static field self::ConcreteClass? Extension1|field5b;
+static field self::Class<self::ConcreteClass>? Extension1|field6a;
+static field self::Class<self::ConcreteClass>? Extension1|field6b;
+static field core::Object? Extension1|field7a;
+static field core::Object? Extension1|field7b;
+static field core::int? Extension1|field8a;
+static field core::int? Extension1|field8b;
+static field self::G<self::Class<dynamic>>? Extension1|field1c;
+static field self::G<self::Class<dynamic>>? Extension1|field1d;
+static field self::G<dynamic>? Extension1|field2c;
+static field self::G<dynamic>? Extension1|field2d;
+static field self::G<self::Class<dynamic>>? Extension1|field3c;
+static field self::G<self::Class<dynamic>>? Extension1|field3d;
+static field self::G<self::Class<dynamic>>? Extension1|field4c;
+static field self::G<self::Class<dynamic>>? Extension1|field4d;
+static field self::G<self::ConcreteClass>? Extension1|field5c;
+static field self::G<self::ConcreteClass>? Extension1|field5d;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6c;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6d;
+static field self::G<core::Object>? Extension1|field7c;
+static field self::G<core::Object>? Extension1|field8d;
+static field self::G<core::int>? Extension1|field8c;
+static field self::G<core::int>? Extension1|field7d;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_fields.dart.weak.outline.expect
new file mode 100644
index 0000000..58b2e77
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart.weak.outline.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_fields.dart:19:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object>? field7a, field7b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:20:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int>? field8a, field8b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:27:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object>? field7c, field8d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:28:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int>? field8c, field7d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:37:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>? field7a, field7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:38:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>? field8a, field8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:45:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>? field7c, field8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:46:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>? field8c, field7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:56:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<Object>? field7a, field7b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:57:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<int>? field8a, field8b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:64:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<Object>? field7c, field8d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:65:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<int>? field8c, field7d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class Class1 extends core::Object {
+  field self::Class<dynamic>? field1a;
+  field self::Class<dynamic>? field1b;
+  field dynamic field2a;
+  field dynamic field2b;
+  field self::Class<dynamic>? field3a;
+  field self::Class<dynamic>? field3b;
+  field self::Class<dynamic>? field4a;
+  field self::Class<dynamic>? field4b;
+  field self::ConcreteClass? field5a;
+  field self::ConcreteClass? field5b;
+  field self::Class<self::ConcreteClass>? field6a;
+  field self::Class<self::ConcreteClass>? field6b;
+  field core::Object? field7a;
+  field core::Object? field7b;
+  field core::int? field8a;
+  field core::int? field8b;
+  field self::G<self::Class<dynamic>>? field1c;
+  field self::G<self::Class<dynamic>>? field1d;
+  field self::G<dynamic>? field2c;
+  field self::G<dynamic>? field2d;
+  field self::G<self::Class<dynamic>>? field3c;
+  field self::G<self::Class<dynamic>>? field3d;
+  field self::G<self::Class<dynamic>>? field4c;
+  field self::G<self::Class<dynamic>>? field4d;
+  field self::G<self::ConcreteClass>? field5c;
+  field self::G<self::ConcreteClass>? field5d;
+  field self::G<self::Class<self::ConcreteClass>>? field6c;
+  field self::G<self::Class<self::ConcreteClass>>? field6d;
+  field self::G<core::Object>? field7c;
+  field self::G<core::Object>? field8d;
+  field self::G<core::int>? field8c;
+  field self::G<core::int>? field7d;
+  synthetic constructor •() → self::Class1
+    ;
+}
+extension Extension1 on core::int {
+  static field field1a = self::Extension1|field1a;
+  static field field1b = self::Extension1|field1b;
+  static field field2a = self::Extension1|field2a;
+  static field field2b = self::Extension1|field2b;
+  static field field3a = self::Extension1|field3a;
+  static field field3b = self::Extension1|field3b;
+  static field field4a = self::Extension1|field4a;
+  static field field4b = self::Extension1|field4b;
+  static field field5a = self::Extension1|field5a;
+  static field field5b = self::Extension1|field5b;
+  static field field6a = self::Extension1|field6a;
+  static field field6b = self::Extension1|field6b;
+  static field field7a = self::Extension1|field7a;
+  static field field7b = self::Extension1|field7b;
+  static field field8a = self::Extension1|field8a;
+  static field field8b = self::Extension1|field8b;
+  static field field1c = self::Extension1|field1c;
+  static field field1d = self::Extension1|field1d;
+  static field field2c = self::Extension1|field2c;
+  static field field2d = self::Extension1|field2d;
+  static field field3c = self::Extension1|field3c;
+  static field field3d = self::Extension1|field3d;
+  static field field4c = self::Extension1|field4c;
+  static field field4d = self::Extension1|field4d;
+  static field field5c = self::Extension1|field5c;
+  static field field5d = self::Extension1|field5d;
+  static field field6c = self::Extension1|field6c;
+  static field field6d = self::Extension1|field6d;
+  static field field7c = self::Extension1|field7c;
+  static field field8d = self::Extension1|field8d;
+  static field field8c = self::Extension1|field8c;
+  static field field7d = self::Extension1|field7d;
+}
+static field self::Class<dynamic>? field1a;
+static field self::Class<dynamic>? field1b;
+static field dynamic field2a;
+static field dynamic field2b;
+static field self::Class<dynamic>? field3a;
+static field self::Class<dynamic>? field3b;
+static field self::Class<dynamic>? field4a;
+static field self::Class<dynamic>? field4b;
+static field self::ConcreteClass? field5a;
+static field self::ConcreteClass? field5b;
+static field self::Class<self::ConcreteClass>? field6a;
+static field self::Class<self::ConcreteClass>? field6b;
+static field core::Object? field7a;
+static field core::Object? field7b;
+static field core::int? field8a;
+static field core::int? field8b;
+static field self::G<self::Class<dynamic>>? field1c;
+static field self::G<self::Class<dynamic>>? field1d;
+static field self::G<dynamic>? field2c;
+static field self::G<dynamic>? field2d;
+static field self::G<self::Class<dynamic>>? field3c;
+static field self::G<self::Class<dynamic>>? field3d;
+static field self::G<self::Class<dynamic>>? field4c;
+static field self::G<self::Class<dynamic>>? field4d;
+static field self::G<self::ConcreteClass>? field5c;
+static field self::G<self::ConcreteClass>? field5d;
+static field self::G<self::Class<self::ConcreteClass>>? field6c;
+static field self::G<self::Class<self::ConcreteClass>>? field6d;
+static field self::G<core::Object>? field7c;
+static field self::G<core::Object>? field8d;
+static field self::G<core::int>? field8c;
+static field self::G<core::int>? field7d;
+static field self::Class<dynamic>? Extension1|field1a;
+static field self::Class<dynamic>? Extension1|field1b;
+static field dynamic Extension1|field2a;
+static field dynamic Extension1|field2b;
+static field self::Class<dynamic>? Extension1|field3a;
+static field self::Class<dynamic>? Extension1|field3b;
+static field self::Class<dynamic>? Extension1|field4a;
+static field self::Class<dynamic>? Extension1|field4b;
+static field self::ConcreteClass? Extension1|field5a;
+static field self::ConcreteClass? Extension1|field5b;
+static field self::Class<self::ConcreteClass>? Extension1|field6a;
+static field self::Class<self::ConcreteClass>? Extension1|field6b;
+static field core::Object? Extension1|field7a;
+static field core::Object? Extension1|field7b;
+static field core::int? Extension1|field8a;
+static field core::int? Extension1|field8b;
+static field self::G<self::Class<dynamic>>? Extension1|field1c;
+static field self::G<self::Class<dynamic>>? Extension1|field1d;
+static field self::G<dynamic>? Extension1|field2c;
+static field self::G<dynamic>? Extension1|field2d;
+static field self::G<self::Class<dynamic>>? Extension1|field3c;
+static field self::G<self::Class<dynamic>>? Extension1|field3d;
+static field self::G<self::Class<dynamic>>? Extension1|field4c;
+static field self::G<self::Class<dynamic>>? Extension1|field4d;
+static field self::G<self::ConcreteClass>? Extension1|field5c;
+static field self::G<self::ConcreteClass>? Extension1|field5d;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6c;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6d;
+static field self::G<core::Object>? Extension1|field7c;
+static field self::G<core::Object>? Extension1|field8d;
+static field self::G<core::int>? Extension1|field8c;
+static field self::G<core::int>? Extension1|field7d;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_fields.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_fields.dart.weak.transformed.expect
new file mode 100644
index 0000000..19cb0c7
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_fields.dart.weak.transformed.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_fields.dart:19:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object>? field7a, field7b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:20:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int>? field8a, field8b; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:27:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object>? field7c, field8d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:28:1: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int>? field8c, field7d; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:37:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>? field7a, field7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:38:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>? field8a, field8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:45:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>? field7c, field8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:46:3: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>? field8c, field7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:56:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<Object>? field7a, field7b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:57:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static F<int>? field8a, field8b; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:64:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<Object>? field7c, field8d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.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_fields.dart:65:10: 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_fields.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   static G<int>? field8c, field7d; // Error
+//          ^
+// pkg/front_end/testcases/general/bounds_fields.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  field self::Class<dynamic>? field1a = null;
+  field self::Class<dynamic>? field1b = null;
+  field dynamic field2a = null;
+  field dynamic field2b = null;
+  field self::Class<dynamic>? field3a = null;
+  field self::Class<dynamic>? field3b = null;
+  field self::Class<dynamic>? field4a = null;
+  field self::Class<dynamic>? field4b = null;
+  field self::ConcreteClass? field5a = null;
+  field self::ConcreteClass? field5b = null;
+  field self::Class<self::ConcreteClass>? field6a = null;
+  field self::Class<self::ConcreteClass>? field6b = null;
+  field core::Object? field7a = null;
+  field core::Object? field7b = null;
+  field core::int? field8a = null;
+  field core::int? field8b = null;
+  field self::G<self::Class<dynamic>>? field1c = null;
+  field self::G<self::Class<dynamic>>? field1d = null;
+  field self::G<dynamic>? field2c = null;
+  field self::G<dynamic>? field2d = null;
+  field self::G<self::Class<dynamic>>? field3c = null;
+  field self::G<self::Class<dynamic>>? field3d = null;
+  field self::G<self::Class<dynamic>>? field4c = null;
+  field self::G<self::Class<dynamic>>? field4d = null;
+  field self::G<self::ConcreteClass>? field5c = null;
+  field self::G<self::ConcreteClass>? field5d = null;
+  field self::G<self::Class<self::ConcreteClass>>? field6c = null;
+  field self::G<self::Class<self::ConcreteClass>>? field6d = null;
+  field self::G<core::Object>? field7c = null;
+  field self::G<core::Object>? field8d = null;
+  field self::G<core::int>? field8c = null;
+  field self::G<core::int>? field7d = null;
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+extension Extension1 on core::int {
+  static field field1a = self::Extension1|field1a;
+  static field field1b = self::Extension1|field1b;
+  static field field2a = self::Extension1|field2a;
+  static field field2b = self::Extension1|field2b;
+  static field field3a = self::Extension1|field3a;
+  static field field3b = self::Extension1|field3b;
+  static field field4a = self::Extension1|field4a;
+  static field field4b = self::Extension1|field4b;
+  static field field5a = self::Extension1|field5a;
+  static field field5b = self::Extension1|field5b;
+  static field field6a = self::Extension1|field6a;
+  static field field6b = self::Extension1|field6b;
+  static field field7a = self::Extension1|field7a;
+  static field field7b = self::Extension1|field7b;
+  static field field8a = self::Extension1|field8a;
+  static field field8b = self::Extension1|field8b;
+  static field field1c = self::Extension1|field1c;
+  static field field1d = self::Extension1|field1d;
+  static field field2c = self::Extension1|field2c;
+  static field field2d = self::Extension1|field2d;
+  static field field3c = self::Extension1|field3c;
+  static field field3d = self::Extension1|field3d;
+  static field field4c = self::Extension1|field4c;
+  static field field4d = self::Extension1|field4d;
+  static field field5c = self::Extension1|field5c;
+  static field field5d = self::Extension1|field5d;
+  static field field6c = self::Extension1|field6c;
+  static field field6d = self::Extension1|field6d;
+  static field field7c = self::Extension1|field7c;
+  static field field8d = self::Extension1|field8d;
+  static field field8c = self::Extension1|field8c;
+  static field field7d = self::Extension1|field7d;
+}
+static field self::Class<dynamic>? field1a;
+static field self::Class<dynamic>? field1b;
+static field dynamic field2a;
+static field dynamic field2b;
+static field self::Class<dynamic>? field3a;
+static field self::Class<dynamic>? field3b;
+static field self::Class<dynamic>? field4a;
+static field self::Class<dynamic>? field4b;
+static field self::ConcreteClass? field5a;
+static field self::ConcreteClass? field5b;
+static field self::Class<self::ConcreteClass>? field6a;
+static field self::Class<self::ConcreteClass>? field6b;
+static field core::Object? field7a;
+static field core::Object? field7b;
+static field core::int? field8a;
+static field core::int? field8b;
+static field self::G<self::Class<dynamic>>? field1c;
+static field self::G<self::Class<dynamic>>? field1d;
+static field self::G<dynamic>? field2c;
+static field self::G<dynamic>? field2d;
+static field self::G<self::Class<dynamic>>? field3c;
+static field self::G<self::Class<dynamic>>? field3d;
+static field self::G<self::Class<dynamic>>? field4c;
+static field self::G<self::Class<dynamic>>? field4d;
+static field self::G<self::ConcreteClass>? field5c;
+static field self::G<self::ConcreteClass>? field5d;
+static field self::G<self::Class<self::ConcreteClass>>? field6c;
+static field self::G<self::Class<self::ConcreteClass>>? field6d;
+static field self::G<core::Object>? field7c;
+static field self::G<core::Object>? field8d;
+static field self::G<core::int>? field8c;
+static field self::G<core::int>? field7d;
+static field self::Class<dynamic>? Extension1|field1a;
+static field self::Class<dynamic>? Extension1|field1b;
+static field dynamic Extension1|field2a;
+static field dynamic Extension1|field2b;
+static field self::Class<dynamic>? Extension1|field3a;
+static field self::Class<dynamic>? Extension1|field3b;
+static field self::Class<dynamic>? Extension1|field4a;
+static field self::Class<dynamic>? Extension1|field4b;
+static field self::ConcreteClass? Extension1|field5a;
+static field self::ConcreteClass? Extension1|field5b;
+static field self::Class<self::ConcreteClass>? Extension1|field6a;
+static field self::Class<self::ConcreteClass>? Extension1|field6b;
+static field core::Object? Extension1|field7a;
+static field core::Object? Extension1|field7b;
+static field core::int? Extension1|field8a;
+static field core::int? Extension1|field8b;
+static field self::G<self::Class<dynamic>>? Extension1|field1c;
+static field self::G<self::Class<dynamic>>? Extension1|field1d;
+static field self::G<dynamic>? Extension1|field2c;
+static field self::G<dynamic>? Extension1|field2d;
+static field self::G<self::Class<dynamic>>? Extension1|field3c;
+static field self::G<self::Class<dynamic>>? Extension1|field3d;
+static field self::G<self::Class<dynamic>>? Extension1|field4c;
+static field self::G<self::Class<dynamic>>? Extension1|field4d;
+static field self::G<self::ConcreteClass>? Extension1|field5c;
+static field self::G<self::ConcreteClass>? Extension1|field5d;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6c;
+static field self::G<self::Class<self::ConcreteClass>>? Extension1|field6d;
+static field self::G<core::Object>? Extension1|field7c;
+static field self::G<core::Object>? Extension1|field8d;
+static field self::G<core::int>? Extension1|field8c;
+static field self::G<core::int>? Extension1|field7d;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_instances.dart b/pkg/front_end/testcases/general/bounds_instances.dart
new file mode 100644
index 0000000..b583f06
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_instances.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = Class1;
+
+class G<X extends Class<X>> {}
+
+class Class1 {}
+
+test() {
+  new F(); // Error
+  new F<dynamic>(); // Error
+  new F<Class>(); // Error
+  new F<Class<dynamic>>(); // Error
+  new F<ConcreteClass>(); // Ok
+  new F<Class<ConcreteClass>>(); // Ok
+  new F<Object>(); // Error
+  new F<int>(); // Error
+  new G(); // Error
+  new G<dynamic>(); // Error
+  new G<Class>(); // Error
+  new G<Class<dynamic>>(); // Error
+  new G<ConcreteClass>(); // Ok
+  new G<Class<ConcreteClass>>(); // Ok
+  new G<Object>(); // Error
+  new G<int>(); // Error
+
+  F.new; // Ok
+  F<dynamic>.new; // Ok
+  F<Class>.new; // Ok
+  F<Class<dynamic>>.new; // Ok
+  F<ConcreteClass>.new; // Ok
+  F<Class<ConcreteClass>>.new; // Ok
+  F<Object>.new; // Error
+  F<int>.new; // Error
+  G.new; // Ok
+  G<dynamic>.new; // Error
+  G<Class>.new; // Error
+  G<Class<dynamic>>.new; // Error
+  G<ConcreteClass>.new; // Ok
+  G<Class<ConcreteClass>>.new; // Ok
+  G<Object>.new; // Error
+  G<int>.new; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_instances.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_instances.dart.textual_outline.expect
new file mode 100644
index 0000000..b507840
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_instances.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = Class1;
+
+class G<X extends Class<X>> {}
+
+class Class1 {}
+
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_instances.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_instances.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..731451e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_instances.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+class Class<T> {}
+
+class Class1 {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+test() {}
+typedef F<X extends Class<X>> = Class1;
diff --git a/pkg/front_end/testcases/general/bounds_instances.dart.weak.expect b/pkg/front_end/testcases/general/bounds_instances.dart.weak.expect
new file mode 100644
index 0000000..d236cbc
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_instances.dart.weak.expect
@@ -0,0 +1,244 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:17:7: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<dynamic>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:18:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<Class>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:19:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<Class<dynamic>>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:22:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<Object>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:23:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<int>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:25:7: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<dynamic>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:26:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<Class>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:27:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<Class<dynamic>>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:30:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<Object>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:31:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<int>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:24:7: Error: Inferred type argument 'Class<Object?>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   new G(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:42:3: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<dynamic>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:43:3: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Class>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:44:3: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Class<dynamic>>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:47:3: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:48:3: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:16:7: Error: Inferred type argument 'Class<Object?>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   new F(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:39:3: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>.new; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:40:3: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>.new; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated X extends self::Class<X> = self::Class<dynamic>> = self::Class1;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::G::•<self::Class<core::Object?>>();
+  new self::G::•<dynamic>();
+  new self::G::•<self::Class<dynamic>>();
+  new self::G::•<self::Class<dynamic>>();
+  new self::G::•<self::ConcreteClass>();
+  new self::G::•<self::Class<self::ConcreteClass>>();
+  new self::G::•<core::Object>();
+  new self::G::•<core::int>();
+  #C1;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C3;
+  #C4;
+  #C5;
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C9;
+}
+static method main() → dynamic {}
+static method _#F#new#tearOff<unrelated X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class1
+  return new self::Class1::•();
+
+constants  {
+  #C1 = static-tearoff self::_#F#new#tearOff
+  #C2 = constructor-tearoff self::Class1::•
+  #C3 = constructor-tearoff self::G::•
+  #C4 = instantiation #C3 <dynamic>
+  #C5 = instantiation #C3 <self::Class<dynamic>*>
+  #C6 = instantiation #C3 <self::ConcreteClass*>
+  #C7 = instantiation #C3 <self::Class<self::ConcreteClass*>*>
+  #C8 = instantiation #C3 <core::Object*>
+  #C9 = instantiation #C3 <core::int*>
+}
diff --git a/pkg/front_end/testcases/general/bounds_instances.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_instances.dart.weak.modular.expect
new file mode 100644
index 0000000..d236cbc
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_instances.dart.weak.modular.expect
@@ -0,0 +1,244 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:17:7: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<dynamic>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:18:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<Class>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:19:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<Class<dynamic>>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:22:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<Object>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:23:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new F<int>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:25:7: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<dynamic>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:26:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<Class>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:27:7: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<Class<dynamic>>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:30:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<Object>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:31:7: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new G<int>(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:24:7: Error: Inferred type argument 'Class<Object?>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   new G(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.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_instances.dart:42:3: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<dynamic>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:43:3: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Class>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:44:3: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Class<dynamic>>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:47:3: Error: Type argument 'Object' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:48:3: Error: Type argument 'int' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G<X> Function<X extends Class<X>>()'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'G' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>.new; // Error
+//   ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:16:7: Error: Inferred type argument 'Class<Object?>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_instances.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   new F(); // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:39:3: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>.new; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_instances.dart:40:3: 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_instances.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>.new; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_instances.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class1;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated X extends self::Class<X> = self::Class<dynamic>> = self::Class1;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::Class1::•();
+  new self::G::•<self::Class<core::Object?>>();
+  new self::G::•<dynamic>();
+  new self::G::•<self::Class<dynamic>>();
+  new self::G::•<self::Class<dynamic>>();
+  new self::G::•<self::ConcreteClass>();
+  new self::G::•<self::Class<self::ConcreteClass>>();
+  new self::G::•<core::Object>();
+  new self::G::•<core::int>();
+  #C1;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C2;
+  #C3;
+  #C4;
+  #C5;
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C9;
+}
+static method main() → dynamic {}
+static method _#F#new#tearOff<unrelated X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class1
+  return new self::Class1::•();
+
+constants  {
+  #C1 = static-tearoff self::_#F#new#tearOff
+  #C2 = constructor-tearoff self::Class1::•
+  #C3 = constructor-tearoff self::G::•
+  #C4 = instantiation #C3 <dynamic>
+  #C5 = instantiation #C3 <self::Class<dynamic>*>
+  #C6 = instantiation #C3 <self::ConcreteClass*>
+  #C7 = instantiation #C3 <self::Class<self::ConcreteClass*>*>
+  #C8 = instantiation #C3 <core::Object*>
+  #C9 = instantiation #C3 <core::int*>
+}
diff --git a/pkg/front_end/testcases/general/bounds_instances.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_instances.dart.weak.outline.expect
new file mode 100644
index 0000000..714445f
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_instances.dart.weak.outline.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated X extends self::Class<X> = self::Class<dynamic>> = self::Class1;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+static method _#F#new#tearOff<unrelated X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class1
+  return new self::Class1::•();
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart b/pkg/front_end/testcases/general/bounds_literals.dart
new file mode 100644
index 0000000..1e9e2aa
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+test() {
+  <F, F<dynamic>>{}; // Ok
+  <F<Class>, F<Class<dynamic>>>{}; // Ok
+  <F<ConcreteClass>, F<Class<ConcreteClass>>>{}; // Ok
+  <F<Object>, F<int>>{}; // Error
+  <G, G<dynamic>>{}; // Ok
+  <G<Class>, G<Class<dynamic>>>{}; // Ok
+  <G<ConcreteClass>, G<Class<ConcreteClass>>>{}; // Ok
+  <G<Object>, G<int>>{}; // Error
+
+  <F>{}; // Ok
+  <F<dynamic>>{}; // Ok
+  <F<Class>>{}; // Ok
+  <F<Class<dynamic>>>{}; // Ok
+  <F<Object>>{}; // Error
+  <F<int>>{}; // Error
+  <F<ConcreteClass>>{}; // Ok
+  <F<Class<ConcreteClass>>>{}; // Ok
+  <G>{}; // Ok
+  <G<dynamic>>{}; // Ok
+  <G<Class>>{}; // Ok
+  <G<Class<dynamic>>>{}; // Ok
+  <G<ConcreteClass>>{}; // Ok
+  <G<Class<ConcreteClass>>>{}; // Ok
+  <G<Object>>{}; // Error
+  <G<int>>{}; // Error
+
+  <F>[]; // Ok
+  <F<dynamic>>[]; // Ok
+  <F<Class>>[]; // Ok
+  <F<Class<dynamic>>>[]; // Ok
+  <F<ConcreteClass>>[]; // Ok
+  <F<Class<ConcreteClass>>>[]; // Ok
+  <F<Object>>[]; // Error
+  <F<int>>[]; // Error
+  <G>[]; // Ok
+  <G<dynamic>>[]; // Ok
+  <G<Class>>[]; // Ok
+  <G<Class<dynamic>>>[]; // Ok
+  <G<ConcreteClass>>[]; // Ok
+  <G<Class<ConcreteClass>>>[]; // Ok
+  <G<Object>>[]; // Error
+  <G<int>>[]; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_literals.dart.textual_outline.expect
new file mode 100644
index 0000000..903ffb2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_literals.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a5aa923
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+test() {}
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart.weak.expect b/pkg/front_end/testcases/general/bounds_literals.dart.weak.expect
new file mode 100644
index 0000000..fc49d81
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart.weak.expect
@@ -0,0 +1,213 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_literals.dart:17:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>, F<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:17:15: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>, F<int>>{}; // Error
+//               ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:21:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>, G<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:21:15: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>, G<int>>{}; // Error
+//               ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:27:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:28:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:37:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:38:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:46:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:47:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<int>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:54:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:55:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<int>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  <self::Class<dynamic>, dynamic>{};
+  <self::Class<dynamic>, self::Class<dynamic>>{};
+  <self::ConcreteClass, self::Class<self::ConcreteClass>>{};
+  <core::Object, core::int>{};
+  <self::G<self::Class<dynamic>>, self::G<self::Class<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>>{};
+  block {
+    final core::Set<self::Class<dynamic>> #t1 = col::LinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t1;
+  block {
+    final core::Set<dynamic> #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2;
+  block {
+    final core::Set<self::Class<dynamic>> #t3 = col::LinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t3;
+  block {
+    final core::Set<self::Class<dynamic>> #t4 = col::LinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t4;
+  block {
+    final core::Set<core::Object> #t5 = col::LinkedHashSet::•<core::Object>();
+  } =>#t5;
+  block {
+    final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>();
+  } =>#t6;
+  block {
+    final core::Set<self::ConcreteClass> #t7 = col::LinkedHashSet::•<self::ConcreteClass>();
+  } =>#t7;
+  block {
+    final core::Set<self::Class<self::ConcreteClass>> #t8 = col::LinkedHashSet::•<self::Class<self::ConcreteClass>>();
+  } =>#t8;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t9 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t9;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t10 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t10;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t11 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t11;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t12 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t12;
+  block {
+    final core::Set<self::G<self::ConcreteClass>> #t13 = col::LinkedHashSet::•<self::G<self::ConcreteClass>>();
+  } =>#t13;
+  block {
+    final core::Set<self::G<self::Class<self::ConcreteClass>>> #t14 = col::LinkedHashSet::•<self::G<self::Class<self::ConcreteClass>>>();
+  } =>#t14;
+  block {
+    final core::Set<self::G<core::Object>> #t15 = col::LinkedHashSet::•<self::G<core::Object>>();
+  } =>#t15;
+  block {
+    final core::Set<self::G<core::int>> #t16 = col::LinkedHashSet::•<self::G<core::int>>();
+  } =>#t16;
+  <self::Class<dynamic>>[];
+  <dynamic>[];
+  <self::Class<dynamic>>[];
+  <self::Class<dynamic>>[];
+  <self::ConcreteClass>[];
+  <self::Class<self::ConcreteClass>>[];
+  <core::Object>[];
+  <core::int>[];
+  <self::G<self::Class<dynamic>>>[];
+  <self::G<self::Class<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>>[];
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..fc49d81
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart.weak.modular.expect
@@ -0,0 +1,213 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_literals.dart:17:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>, F<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:17:15: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>, F<int>>{}; // Error
+//               ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:21:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>, G<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:21:15: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>, G<int>>{}; // Error
+//               ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:27:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:28:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:37:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:38:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:46:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:47:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<int>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:54:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:55:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<int>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  <self::Class<dynamic>, dynamic>{};
+  <self::Class<dynamic>, self::Class<dynamic>>{};
+  <self::ConcreteClass, self::Class<self::ConcreteClass>>{};
+  <core::Object, core::int>{};
+  <self::G<self::Class<dynamic>>, self::G<self::Class<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>>{};
+  block {
+    final core::Set<self::Class<dynamic>> #t1 = col::LinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t1;
+  block {
+    final core::Set<dynamic> #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2;
+  block {
+    final core::Set<self::Class<dynamic>> #t3 = col::LinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t3;
+  block {
+    final core::Set<self::Class<dynamic>> #t4 = col::LinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t4;
+  block {
+    final core::Set<core::Object> #t5 = col::LinkedHashSet::•<core::Object>();
+  } =>#t5;
+  block {
+    final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>();
+  } =>#t6;
+  block {
+    final core::Set<self::ConcreteClass> #t7 = col::LinkedHashSet::•<self::ConcreteClass>();
+  } =>#t7;
+  block {
+    final core::Set<self::Class<self::ConcreteClass>> #t8 = col::LinkedHashSet::•<self::Class<self::ConcreteClass>>();
+  } =>#t8;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t9 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t9;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t10 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t10;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t11 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t11;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t12 = col::LinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t12;
+  block {
+    final core::Set<self::G<self::ConcreteClass>> #t13 = col::LinkedHashSet::•<self::G<self::ConcreteClass>>();
+  } =>#t13;
+  block {
+    final core::Set<self::G<self::Class<self::ConcreteClass>>> #t14 = col::LinkedHashSet::•<self::G<self::Class<self::ConcreteClass>>>();
+  } =>#t14;
+  block {
+    final core::Set<self::G<core::Object>> #t15 = col::LinkedHashSet::•<self::G<core::Object>>();
+  } =>#t15;
+  block {
+    final core::Set<self::G<core::int>> #t16 = col::LinkedHashSet::•<self::G<core::int>>();
+  } =>#t16;
+  <self::Class<dynamic>>[];
+  <dynamic>[];
+  <self::Class<dynamic>>[];
+  <self::Class<dynamic>>[];
+  <self::ConcreteClass>[];
+  <self::Class<self::ConcreteClass>>[];
+  <core::Object>[];
+  <core::int>[];
+  <self::G<self::Class<dynamic>>>[];
+  <self::G<self::Class<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>>[];
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_literals.dart.weak.outline.expect
new file mode 100644
index 0000000..3215dc6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_literals.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_literals.dart.weak.transformed.expect
new file mode 100644
index 0000000..5c630d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_literals.dart.weak.transformed.expect
@@ -0,0 +1,213 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_literals.dart:17:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>, F<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:17:15: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>, F<int>>{}; // Error
+//               ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:21:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>, G<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:21:15: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>, G<int>>{}; // Error
+//               ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:27:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:28:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:37:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:38:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<int>>{}; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:46:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<Object>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:47:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <F<int>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:54:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<Object>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.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_literals.dart:55:4: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   <G<int>>[]; // Error
+//    ^
+// pkg/front_end/testcases/general/bounds_literals.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  <self::Class<dynamic>, dynamic>{};
+  <self::Class<dynamic>, self::Class<dynamic>>{};
+  <self::ConcreteClass, self::Class<self::ConcreteClass>>{};
+  <core::Object, core::int>{};
+  <self::G<self::Class<dynamic>>, self::G<self::Class<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>>{};
+  block {
+    final core::Set<self::Class<dynamic>> #t1 = new col::_CompactLinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t1;
+  block {
+    final core::Set<dynamic> #t2 = new col::_CompactLinkedHashSet::•<dynamic>();
+  } =>#t2;
+  block {
+    final core::Set<self::Class<dynamic>> #t3 = new col::_CompactLinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t3;
+  block {
+    final core::Set<self::Class<dynamic>> #t4 = new col::_CompactLinkedHashSet::•<self::Class<dynamic>>();
+  } =>#t4;
+  block {
+    final core::Set<core::Object> #t5 = new col::_CompactLinkedHashSet::•<core::Object>();
+  } =>#t5;
+  block {
+    final core::Set<core::int> #t6 = new col::_CompactLinkedHashSet::•<core::int>();
+  } =>#t6;
+  block {
+    final core::Set<self::ConcreteClass> #t7 = new col::_CompactLinkedHashSet::•<self::ConcreteClass>();
+  } =>#t7;
+  block {
+    final core::Set<self::Class<self::ConcreteClass>> #t8 = new col::_CompactLinkedHashSet::•<self::Class<self::ConcreteClass>>();
+  } =>#t8;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t9 = new col::_CompactLinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t9;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t10 = new col::_CompactLinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t10;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t11 = new col::_CompactLinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t11;
+  block {
+    final core::Set<self::G<self::Class<dynamic>>> #t12 = new col::_CompactLinkedHashSet::•<self::G<self::Class<dynamic>>>();
+  } =>#t12;
+  block {
+    final core::Set<self::G<self::ConcreteClass>> #t13 = new col::_CompactLinkedHashSet::•<self::G<self::ConcreteClass>>();
+  } =>#t13;
+  block {
+    final core::Set<self::G<self::Class<self::ConcreteClass>>> #t14 = new col::_CompactLinkedHashSet::•<self::G<self::Class<self::ConcreteClass>>>();
+  } =>#t14;
+  block {
+    final core::Set<self::G<core::Object>> #t15 = new col::_CompactLinkedHashSet::•<self::G<core::Object>>();
+  } =>#t15;
+  block {
+    final core::Set<self::G<core::int>> #t16 = new col::_CompactLinkedHashSet::•<self::G<core::int>>();
+  } =>#t16;
+  core::_GrowableList::•<self::Class<dynamic>>(0);
+  core::_GrowableList::•<dynamic>(0);
+  core::_GrowableList::•<self::Class<dynamic>>(0);
+  core::_GrowableList::•<self::Class<dynamic>>(0);
+  core::_GrowableList::•<self::ConcreteClass>(0);
+  core::_GrowableList::•<self::Class<self::ConcreteClass>>(0);
+  core::_GrowableList::•<core::Object>(0);
+  core::_GrowableList::•<core::int>(0);
+  core::_GrowableList::•<self::G<self::Class<dynamic>>>(0);
+  core::_GrowableList::•<self::G<self::Class<dynamic>>>(0);
+  core::_GrowableList::•<self::G<self::Class<dynamic>>>(0);
+  core::_GrowableList::•<self::G<self::Class<dynamic>>>(0);
+  core::_GrowableList::•<self::G<self::ConcreteClass>>(0);
+  core::_GrowableList::•<self::G<self::Class<self::ConcreteClass>>>(0);
+  core::_GrowableList::•<self::G<core::Object>>(0);
+  core::_GrowableList::•<self::G<core::int>>(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart b/pkg/front_end/testcases/general/bounds_parameters.dart
new file mode 100644
index 0000000..98d74d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+void method1(
+  F t1, // Ok
+  F<dynamic> t2, // Ok
+  F<Class> t3, // Ok
+  F<Class<dynamic>> t4, // Ok
+  F<ConcreteClass> t5, // Ok
+  F<Class<ConcreteClass>> t6, // Ok
+  F<Object> t7, // Error
+  F<int> t8, // Error
+  {
+  required G s1, // Ok
+  required G<dynamic> s2, // Ok
+  required G<Class> s3, // Ok
+  required G<Class<dynamic>> s4, // Ok
+  required G<ConcreteClass> s5, // Ok
+  required G<Class<ConcreteClass>> s6, // Ok
+  required G<Object> s7, // Error
+  required G<int> s8, // Error
+}) {
+  void local(
+    F t1, // Ok
+    F<dynamic> t2, // Ok
+    F<Class> t3, // Ok
+    F<Class<dynamic>> t4, // Ok
+    F<ConcreteClass> t5, // Ok
+    F<Class<ConcreteClass>> t6, // Ok
+    F<Object> t7, // Error
+    F<int> t8, // Error
+    {
+    required G s1, // Ok
+    required G<dynamic> s2, // Ok
+    required G<Class> s3, // Ok
+    required G<Class<dynamic>> s4, // Ok
+    required G<ConcreteClass> s5, // Ok
+    required G<Class<ConcreteClass>> s6, // Ok
+    required G<Object> s7, // Error
+    required G<int> s8, // Error
+  }) {}
+  (
+    F t1, // Ok
+    F<dynamic> t2, // Ok
+    F<Class> t3, // Ok
+    F<Class<dynamic>> t4, // Ok
+    F<ConcreteClass> t5, // Ok
+    F<Class<ConcreteClass>> t6, // Ok
+    F<Object> t7, // Error
+    F<int> t8, // Error
+    {
+    required G s1, // Ok
+    required G<dynamic> s2, // Ok
+    required G<Class> s3, // Ok
+    required G<Class<dynamic>> s4, // Ok
+    required G<ConcreteClass> s5, // Ok
+    required G<Class<ConcreteClass>> s6, // Ok
+    required G<Object> s7, // Error
+    required G<int> s8, // Error
+  }) {};
+}
+
+class Class1 {
+  Class1(
+    F t1, // Ok
+    F<dynamic> t2, // Ok
+    F<Class> t3, // Ok
+    F<Class<dynamic>> t4, // Ok
+    F<ConcreteClass> t5, // Ok
+    F<Class<ConcreteClass>> t6, // Ok
+    F<Object> t7, // Error
+    F<int> t8, // Error
+    {
+    required G s1, // Ok
+    required G<dynamic> s2, // Ok
+    required G<Class> s3, // Ok
+    required G<Class<dynamic>> s4, // Ok
+    required G<ConcreteClass> s5, // Ok
+    required G<Class<ConcreteClass>> s6, // Ok
+    required G<Object> s7, // Error
+    required G<int> s8, // Error
+  });
+  void method2(
+    F t1, // Ok
+    F<dynamic> t2, // Ok
+    F<Class> t3, // Ok
+    F<Class<dynamic>> t4, // Ok
+    F<ConcreteClass> t5, // Ok
+    F<Class<ConcreteClass>> t6, // Ok
+    F<Object> t7, // Error
+    F<int> t8, // Error
+    {
+    required G s1, // Ok
+    required G<dynamic> s2, // Ok
+    required G<Class> s3, // Ok
+    required G<Class<dynamic>> s4, // Ok
+    required G<ConcreteClass> s5, // Ok
+    required G<Class<ConcreteClass>> s6, // Ok
+    required G<Object> s7, // Error
+    required G<int> s8, // Error
+  }) {}
+}
+
+extension Extension1 on int {
+  void method3(
+    F t1, // Ok
+    F<dynamic> t2, // Ok
+    F<Class> t3, // Ok
+    F<Class<dynamic>> t4, // Ok
+    F<ConcreteClass> t5, // Ok
+    F<Class<ConcreteClass>> t6, // Ok
+    F<Object> t7, // Error
+    F<int> t8, // Error
+    {
+    required G s1, // Ok
+    required G<dynamic> s2, // Ok
+    required G<Class> s3, // Ok
+    required G<Class<dynamic>> s4, // Ok
+    required G<ConcreteClass> s5, // Ok
+    required G<Class<ConcreteClass>> s6, // Ok
+    required G<Object> s7, // Error
+    required G<int> s8, // Error
+  }) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..27b2f52
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.textual_outline.expect
@@ -0,0 +1,88 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+void method1(
+  F t1,
+  F<dynamic> t2,
+  F<Class> t3,
+  F<Class<dynamic>> t4,
+  F<ConcreteClass> t5,
+  F<Class<ConcreteClass>> t6,
+  F<Object> t7,
+  F<int> t8, {
+  required G s1,
+  required G<dynamic> s2,
+  required G<Class> s3,
+  required G<Class<dynamic>> s4,
+  required G<ConcreteClass> s5,
+  required G<Class<ConcreteClass>> s6,
+  required G<Object> s7,
+  required G<int> s8,
+}) {}
+
+class Class1 {
+  Class1(
+    F t1,
+    F<dynamic> t2,
+    F<Class> t3,
+    F<Class<dynamic>> t4,
+    F<ConcreteClass> t5,
+    F<Class<ConcreteClass>> t6,
+    F<Object> t7,
+    F<int> t8, {
+    required G s1,
+    required G<dynamic> s2,
+    required G<Class> s3,
+    required G<Class<dynamic>> s4,
+    required G<ConcreteClass> s5,
+    required G<Class<ConcreteClass>> s6,
+    required G<Object> s7,
+    required G<int> s8,
+  });
+  void method2(
+    F t1,
+    F<dynamic> t2,
+    F<Class> t3,
+    F<Class<dynamic>> t4,
+    F<ConcreteClass> t5,
+    F<Class<ConcreteClass>> t6,
+    F<Object> t7,
+    F<int> t8, {
+    required G s1,
+    required G<dynamic> s2,
+    required G<Class> s3,
+    required G<Class<dynamic>> s4,
+    required G<ConcreteClass> s5,
+    required G<Class<ConcreteClass>> s6,
+    required G<Object> s7,
+    required G<int> s8,
+  }) {}
+}
+
+extension Extension1 on int {
+  void method3(
+    F t1,
+    F<dynamic> t2,
+    F<Class> t3,
+    F<Class<dynamic>> t4,
+    F<ConcreteClass> t5,
+    F<Class<ConcreteClass>> t6,
+    F<Object> t7,
+    F<int> t8, {
+    required G s1,
+    required G<dynamic> s2,
+    required G<Class> s3,
+    required G<Class<dynamic>> s4,
+    required G<ConcreteClass> s5,
+    required G<Class<ConcreteClass>> s6,
+    required G<Object> s7,
+    required G<int> s8,
+  }) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..443433c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.textual_outline_modelled.expect
@@ -0,0 +1,86 @@
+class Class<T> {}
+
+class Class1 {
+  Class1(
+    F t1,
+    F<dynamic> t2,
+    F<Class> t3,
+    F<Class<dynamic>> t4,
+    F<ConcreteClass> t5,
+    F<Class<ConcreteClass>> t6,
+    F<Object> t7,
+    F<int> t8, {
+    required G s1,
+    required G<dynamic> s2,
+    required G<Class> s3,
+    required G<Class<dynamic>> s4,
+    required G<ConcreteClass> s5,
+    required G<Class<ConcreteClass>> s6,
+    required G<Object> s7,
+    required G<int> s8,
+  });
+  void method2(
+    F t1,
+    F<dynamic> t2,
+    F<Class> t3,
+    F<Class<dynamic>> t4,
+    F<ConcreteClass> t5,
+    F<Class<ConcreteClass>> t6,
+    F<Object> t7,
+    F<int> t8, {
+    required G s1,
+    required G<dynamic> s2,
+    required G<Class> s3,
+    required G<Class<dynamic>> s4,
+    required G<ConcreteClass> s5,
+    required G<Class<ConcreteClass>> s6,
+    required G<Object> s7,
+    required G<int> s8,
+  }) {}
+}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+extension Extension1 on int {
+  void method3(
+    F t1,
+    F<dynamic> t2,
+    F<Class> t3,
+    F<Class<dynamic>> t4,
+    F<ConcreteClass> t5,
+    F<Class<ConcreteClass>> t6,
+    F<Object> t7,
+    F<int> t8, {
+    required G s1,
+    required G<dynamic> s2,
+    required G<Class> s3,
+    required G<Class<dynamic>> s4,
+    required G<ConcreteClass> s5,
+    required G<Class<ConcreteClass>> s6,
+    required G<Object> s7,
+    required G<int> s8,
+  }) {}
+}
+
+main() {}
+typedef F<X extends Class<X>> = X;
+void method1(
+  F t1,
+  F<dynamic> t2,
+  F<Class> t3,
+  F<Class<dynamic>> t4,
+  F<ConcreteClass> t5,
+  F<Class<ConcreteClass>> t6,
+  F<Object> t7,
+  F<int> t8, {
+  required G s1,
+  required G<dynamic> s2,
+  required G<Class> s3,
+  required G<Class<dynamic>> s4,
+  required G<ConcreteClass> s5,
+  required G<Class<ConcreteClass>> s6,
+  required G<Object> s7,
+  required G<int> s8,
+}) {}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect
new file mode 100644
index 0000000..da70b89
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_parameters.dart:20:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:21:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:29:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<Object> s7, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:30:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<int> s8, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:99:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:100:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:108:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:109:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:80:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:81:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:89:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:90:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:121:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:122:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:130:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:131:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:39:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:40:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:48:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:49:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:58:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:59:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:67:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:68:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  constructor •(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → self::Class1
+    : super core::Object::•()
+    ;
+  method method2(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+}
+extension Extension1 on core::int {
+  method method3 = self::Extension1|method3;
+  tearoff method3 = self::Extension1|get#method3;
+}
+static method method1(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {
+  function local(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+  (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → Null {};
+}
+static method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+static method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1 = #C1, self::G<dynamic> s2 = #C1, self::G<self::Class<dynamic>> s3 = #C1, self::G<self::Class<dynamic>> s4 = #C1, self::G<self::ConcreteClass> s5 = #C1, self::G<self::Class<self::ConcreteClass>> s6 = #C1, self::G<core::Object> s7 = #C1, self::G<core::int> s8 = #C1}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..da70b89
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.modular.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_parameters.dart:20:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:21:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:29:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<Object> s7, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:30:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<int> s8, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:99:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:100:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:108:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:109:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:80:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:81:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:89:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:90:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:121:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:122:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:130:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:131:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:39:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:40:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:48:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:49:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:58:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:59:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:67:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:68:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  constructor •(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → self::Class1
+    : super core::Object::•()
+    ;
+  method method2(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+}
+extension Extension1 on core::int {
+  method method3 = self::Extension1|method3;
+  tearoff method3 = self::Extension1|get#method3;
+}
+static method method1(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {
+  function local(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+  (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → Null {};
+}
+static method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+static method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1 = #C1, self::G<dynamic> s2 = #C1, self::G<self::Class<dynamic>> s3 = #C1, self::G<self::Class<dynamic>> s4 = #C1, self::G<self::ConcreteClass> s5 = #C1, self::G<self::Class<self::ConcreteClass>> s6 = #C1, self::G<core::Object> s7 = #C1, self::G<core::int> s8 = #C1}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..841b07a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.outline.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_parameters.dart:20:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:21:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:29:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<Object> s7, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:30:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<int> s8, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:99:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:100:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:108:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:109:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:80:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:81:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:89:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:90:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:121:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:122:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:130:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:131:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class Class1 extends core::Object {
+  constructor •(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = null, required self::G<dynamic> s2 = null, required self::G<self::Class<dynamic>> s3 = null, required self::G<self::Class<dynamic>> s4 = null, required self::G<self::ConcreteClass> s5 = null, required self::G<self::Class<self::ConcreteClass>> s6 = null, required self::G<core::Object> s7 = null, required self::G<core::int> s8 = null}) → self::Class1
+    ;
+  method method2(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = null, required self::G<dynamic> s2 = null, required self::G<self::Class<dynamic>> s3 = null, required self::G<self::Class<dynamic>> s4 = null, required self::G<self::ConcreteClass> s5 = null, required self::G<self::Class<self::ConcreteClass>> s6 = null, required self::G<core::Object> s7 = null, required self::G<core::int> s8 = null}) → void
+    ;
+}
+extension Extension1 on core::int {
+  method method3 = self::Extension1|method3;
+  tearoff method3 = self::Extension1|get#method3;
+}
+static method method1(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void
+  ;
+static method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1, required self::G<dynamic> s2, required self::G<self::Class<dynamic>> s3, required self::G<self::Class<dynamic>> s4, required self::G<self::ConcreteClass> s5, required self::G<self::Class<self::ConcreteClass>> s6, required self::G<core::Object> s7, required self::G<core::int> s8}) → void
+  ;
+static method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1, self::G<dynamic> s2, self::G<self::Class<dynamic>> s3, self::G<self::Class<dynamic>> s4, self::G<self::ConcreteClass> s5, self::G<self::Class<self::ConcreteClass>> s6, self::G<core::Object> s7, self::G<core::int> s8}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..da70b89
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_parameters.dart.weak.transformed.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_parameters.dart:20:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:21:3: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8, // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:29:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<Object> s7, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:30:12: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   required G<int> s8, // Error
+//            ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:99:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:100:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:108:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:109:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:80:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:81:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:89:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:90:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:121:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:122:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:130:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:131:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:39:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:40:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:48:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:49:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:58:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<Object> t7, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:59:5: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     F<int> t8, // Error
+//     ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:67:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<Object> s7, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_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_parameters.dart:68:14: 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_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     required G<int> s8, // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_parameters.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  constructor •(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → self::Class1
+    : super core::Object::•()
+    ;
+  method method2(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+}
+extension Extension1 on core::int {
+  method method3 = self::Extension1|method3;
+  tearoff method3 = self::Extension1|get#method3;
+}
+static method method1(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {
+  function local(self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+  (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → Null {};
+}
+static method Extension1|method3(lowered final core::int #this, self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {required self::G<self::Class<dynamic>> s1 = #C1, required self::G<dynamic> s2 = #C1, required self::G<self::Class<dynamic>> s3 = #C1, required self::G<self::Class<dynamic>> s4 = #C1, required self::G<self::ConcreteClass> s5 = #C1, required self::G<self::Class<self::ConcreteClass>> s6 = #C1, required self::G<core::Object> s7 = #C1, required self::G<core::int> s8 = #C1}) → void {}
+static method Extension1|get#method3(lowered final core::int #this) → (self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, core::int, {s1: self::G<self::Class<dynamic>>, s2: self::G<dynamic>, s3: self::G<self::Class<dynamic>>, s4: self::G<self::Class<dynamic>>, s5: self::G<self::ConcreteClass>, s6: self::G<self::Class<self::ConcreteClass>>, s7: self::G<core::Object>, s8: self::G<core::int>}) → void
+  return (self::Class<dynamic> t1, dynamic t2, self::Class<dynamic> t3, self::Class<dynamic> t4, self::ConcreteClass t5, self::Class<self::ConcreteClass> t6, core::Object t7, core::int t8, {self::G<self::Class<dynamic>> s1 = #C1, self::G<dynamic> s2 = #C1, self::G<self::Class<dynamic>> s3 = #C1, self::G<self::Class<dynamic>> s4 = #C1, self::G<self::ConcreteClass> s5 = #C1, self::G<self::Class<self::ConcreteClass>> s6 = #C1, self::G<core::Object> s7 = #C1, self::G<core::int> s8 = #C1}) → void => self::Extension1|method3(#this, t1, t2, t3, t4, t5, t6, t7, t8, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, s6: s6, s7: s7, s8: s8);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart b/pkg/front_end/testcases/general/bounds_return_types.dart
new file mode 100644
index 0000000..54e4b2f
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+F t1() => throw ''; // Ok
+F<dynamic> t2() => throw ''; // Ok
+F<Class> t3() => throw ''; // Ok
+F<Class<dynamic>> t4() => throw ''; // Ok
+F<ConcreteClass> t5() => throw ''; // Ok
+F<Class<ConcreteClass>> t6() => throw ''; // Ok
+F<Object> t7() => throw ''; // Error
+F<int> t8() => throw ''; // Error
+G s1() => throw ''; // Ok
+G<dynamic> s2() => throw ''; // Ok
+G<Class> s3() => throw ''; // Ok
+G<Class<dynamic>> s4() => throw ''; // Ok
+G<ConcreteClass> s5() => throw ''; // Ok
+G<Class<ConcreteClass>> s6() => throw ''; // Ok
+G<Object> s7() => throw ''; // Error
+G<int> s8() => throw ''; // Error
+
+method1() {
+  F t1() => throw ''; // Ok
+  F<dynamic> t2() => throw ''; // Ok
+  F<Class> t3() => throw ''; // Ok
+  F<Class<dynamic>> t4() => throw ''; // Ok
+  F<ConcreteClass> t5() => throw ''; // Ok
+  F<Class<ConcreteClass>> t6() => throw ''; // Ok
+  F<Object> t7() => throw ''; // Error
+  F<int> t8() => throw ''; // Error
+  G s1() => throw ''; // Ok
+  G<dynamic> s2() => throw ''; // Ok
+  G<Class> s3() => throw ''; // Ok
+  G<Class<dynamic>> s4() => throw ''; // Ok
+  G<ConcreteClass> s5() => throw ''; // Ok
+  G<Class<ConcreteClass>> s6() => throw ''; // Ok
+  G<Object> s7() => throw ''; // Error
+  G<int> s8() => throw ''; // Error
+}
+
+class Class1 {
+  F t1() => throw ''; // Ok
+  F<dynamic> t2() => throw ''; // Ok
+  F<Class> t3() => throw ''; // Ok
+  F<Class<dynamic>> t4() => throw ''; // Ok
+  F<ConcreteClass> t5() => throw ''; // Ok
+  F<Class<ConcreteClass>> t6() => throw ''; // Ok
+  F<Object> t7() => throw ''; // Error
+  F<int> t8() => throw ''; // Error
+  G s1() => throw ''; // Ok
+  G<dynamic> s2() => throw ''; // Ok
+  G<Class> s3() => throw ''; // Ok
+  G<Class<dynamic>> s4() => throw ''; // Ok
+  G<ConcreteClass> s5() => throw ''; // Ok
+  G<Class<ConcreteClass>> s6() => throw ''; // Ok
+  G<Object> s7() => throw ''; // Error
+  G<int> s8() => throw ''; // Error
+}
+
+extension Extension1 on int {
+  F t1() => throw ''; // Ok
+  F<dynamic> t2() => throw ''; // Ok
+  F<Class> t3() => throw ''; // Ok
+  F<Class<dynamic>> t4() => throw ''; // Ok
+  F<ConcreteClass> t5() => throw ''; // Ok
+  F<Class<ConcreteClass>> t6() => throw ''; // Ok
+  F<Object> t7() => throw ''; // Error
+  F<int> t8() => throw ''; // Error
+  G s1() => throw ''; // Ok
+  G<dynamic> s2() => throw ''; // Ok
+  G<Class> s3() => throw ''; // Ok
+  G<Class<dynamic>> s4() => throw ''; // Ok
+  G<ConcreteClass> s5() => throw ''; // Ok
+  G<Class<ConcreteClass>> s6() => throw ''; // Ok
+  G<Object> s7() => throw ''; // Error
+  G<int> s8() => throw ''; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_return_types.dart.textual_outline.expect
new file mode 100644
index 0000000..0e5dcfa
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart.textual_outline.expect
@@ -0,0 +1,65 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+F t1() => throw '';
+F<dynamic> t2() => throw '';
+F<Class> t3() => throw '';
+F<Class<dynamic>> t4() => throw '';
+F<ConcreteClass> t5() => throw '';
+F<Class<ConcreteClass>> t6() => throw '';
+F<Object> t7() => throw '';
+F<int> t8() => throw '';
+G s1() => throw '';
+G<dynamic> s2() => throw '';
+G<Class> s3() => throw '';
+G<Class<dynamic>> s4() => throw '';
+G<ConcreteClass> s5() => throw '';
+G<Class<ConcreteClass>> s6() => throw '';
+G<Object> s7() => throw '';
+G<int> s8() => throw '';
+method1() {}
+
+class Class1 {
+  F t1() => throw '';
+  F<dynamic> t2() => throw '';
+  F<Class> t3() => throw '';
+  F<Class<dynamic>> t4() => throw '';
+  F<ConcreteClass> t5() => throw '';
+  F<Class<ConcreteClass>> t6() => throw '';
+  F<Object> t7() => throw '';
+  F<int> t8() => throw '';
+  G s1() => throw '';
+  G<dynamic> s2() => throw '';
+  G<Class> s3() => throw '';
+  G<Class<dynamic>> s4() => throw '';
+  G<ConcreteClass> s5() => throw '';
+  G<Class<ConcreteClass>> s6() => throw '';
+  G<Object> s7() => throw '';
+  G<int> s8() => throw '';
+}
+
+extension Extension1 on int {
+  F t1() => throw '';
+  F<dynamic> t2() => throw '';
+  F<Class> t3() => throw '';
+  F<Class<dynamic>> t4() => throw '';
+  F<ConcreteClass> t5() => throw '';
+  F<Class<ConcreteClass>> t6() => throw '';
+  F<Object> t7() => throw '';
+  F<int> t8() => throw '';
+  G s1() => throw '';
+  G<dynamic> s2() => throw '';
+  G<Class> s3() => throw '';
+  G<Class<dynamic>> s4() => throw '';
+  G<ConcreteClass> s5() => throw '';
+  G<Class<ConcreteClass>> s6() => throw '';
+  G<Object> s7() => throw '';
+  G<int> s8() => throw '';
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_return_types.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..d6ea412
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart.textual_outline_modelled.expect
@@ -0,0 +1,64 @@
+F<Class<ConcreteClass>> t6() => throw '';
+F<Class<dynamic>> t4() => throw '';
+F<Class> t3() => throw '';
+F<ConcreteClass> t5() => throw '';
+F<Object> t7() => throw '';
+F<dynamic> t2() => throw '';
+F<int> t8() => throw '';
+F t1() => throw '';
+G<Class<ConcreteClass>> s6() => throw '';
+G<Class<dynamic>> s4() => throw '';
+G<Class> s3() => throw '';
+G<ConcreteClass> s5() => throw '';
+G<Object> s7() => throw '';
+G<dynamic> s2() => throw '';
+G<int> s8() => throw '';
+G s1() => throw '';
+
+class Class<T> {}
+
+class Class1 {
+  F<Class<ConcreteClass>> t6() => throw '';
+  F<Class<dynamic>> t4() => throw '';
+  F<Class> t3() => throw '';
+  F<ConcreteClass> t5() => throw '';
+  F<Object> t7() => throw '';
+  F<dynamic> t2() => throw '';
+  F<int> t8() => throw '';
+  F t1() => throw '';
+  G<Class<ConcreteClass>> s6() => throw '';
+  G<Class<dynamic>> s4() => throw '';
+  G<Class> s3() => throw '';
+  G<ConcreteClass> s5() => throw '';
+  G<Object> s7() => throw '';
+  G<dynamic> s2() => throw '';
+  G<int> s8() => throw '';
+  G s1() => throw '';
+}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+extension Extension1 on int {
+  F<Class<ConcreteClass>> t6() => throw '';
+  F<Class<dynamic>> t4() => throw '';
+  F<Class> t3() => throw '';
+  F<ConcreteClass> t5() => throw '';
+  F<Object> t7() => throw '';
+  F<dynamic> t2() => throw '';
+  F<int> t8() => throw '';
+  F t1() => throw '';
+  G<Class<ConcreteClass>> s6() => throw '';
+  G<Class<dynamic>> s4() => throw '';
+  G<Class> s3() => throw '';
+  G<ConcreteClass> s5() => throw '';
+  G<Object> s7() => throw '';
+  G<dynamic> s2() => throw '';
+  G<int> s8() => throw '';
+  G s1() => throw '';
+}
+
+main() {}
+method1() {}
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart.weak.expect b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.expect
new file mode 100644
index 0000000..6adeaf2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.expect
@@ -0,0 +1,377 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_return_types.dart:19:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object> t7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:20:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int> t8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:27:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object> s7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:28:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int> s8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:56:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:57:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:64:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:65:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:75:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:76:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:83:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:84:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:37:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:38:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:45:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:46:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  method t1() → self::Class<dynamic>
+    return throw "";
+  method t2() → dynamic
+    return throw "";
+  method t3() → self::Class<dynamic>
+    return throw "";
+  method t4() → self::Class<dynamic>
+    return throw "";
+  method t5() → self::ConcreteClass
+    return throw "";
+  method t6() → self::Class<self::ConcreteClass>
+    return throw "";
+  method t7() → core::Object
+    return throw "";
+  method t8() → core::int
+    return throw "";
+  method s1() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s2() → self::G<dynamic>
+    return throw "";
+  method s3() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s4() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s5() → self::G<self::ConcreteClass>
+    return throw "";
+  method s6() → self::G<self::Class<self::ConcreteClass>>
+    return throw "";
+  method s7() → self::G<core::Object>
+    return throw "";
+  method s8() → self::G<core::int>
+    return throw "";
+}
+extension Extension1 on core::int {
+  method t1 = self::Extension1|t1;
+  tearoff t1 = self::Extension1|get#t1;
+  method t2 = self::Extension1|t2;
+  tearoff t2 = self::Extension1|get#t2;
+  method t3 = self::Extension1|t3;
+  tearoff t3 = self::Extension1|get#t3;
+  method t4 = self::Extension1|t4;
+  tearoff t4 = self::Extension1|get#t4;
+  method t5 = self::Extension1|t5;
+  tearoff t5 = self::Extension1|get#t5;
+  method t6 = self::Extension1|t6;
+  tearoff t6 = self::Extension1|get#t6;
+  method t7 = self::Extension1|t7;
+  tearoff t7 = self::Extension1|get#t7;
+  method t8 = self::Extension1|t8;
+  tearoff t8 = self::Extension1|get#t8;
+  method s1 = self::Extension1|s1;
+  tearoff s1 = self::Extension1|get#s1;
+  method s2 = self::Extension1|s2;
+  tearoff s2 = self::Extension1|get#s2;
+  method s3 = self::Extension1|s3;
+  tearoff s3 = self::Extension1|get#s3;
+  method s4 = self::Extension1|s4;
+  tearoff s4 = self::Extension1|get#s4;
+  method s5 = self::Extension1|s5;
+  tearoff s5 = self::Extension1|get#s5;
+  method s6 = self::Extension1|s6;
+  tearoff s6 = self::Extension1|get#s6;
+  method s7 = self::Extension1|s7;
+  tearoff s7 = self::Extension1|get#s7;
+  method s8 = self::Extension1|s8;
+  tearoff s8 = self::Extension1|get#s8;
+}
+static method t1() → self::Class<dynamic>
+  return throw "";
+static method t2() → dynamic
+  return throw "";
+static method t3() → self::Class<dynamic>
+  return throw "";
+static method t4() → self::Class<dynamic>
+  return throw "";
+static method t5() → self::ConcreteClass
+  return throw "";
+static method t6() → self::Class<self::ConcreteClass>
+  return throw "";
+static method t7() → core::Object
+  return throw "";
+static method t8() → core::int
+  return throw "";
+static method s1() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s2() → self::G<dynamic>
+  return throw "";
+static method s3() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s4() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s5() → self::G<self::ConcreteClass>
+  return throw "";
+static method s6() → self::G<self::Class<self::ConcreteClass>>
+  return throw "";
+static method s7() → self::G<core::Object>
+  return throw "";
+static method s8() → self::G<core::int>
+  return throw "";
+static method method1() → dynamic {
+  function t1() → self::Class<dynamic>
+    return throw "";
+  function t2() → dynamic
+    return throw "";
+  function t3() → self::Class<dynamic>
+    return throw "";
+  function t4() → self::Class<dynamic>
+    return throw "";
+  function t5() → self::ConcreteClass
+    return throw "";
+  function t6() → self::Class<self::ConcreteClass>
+    return throw "";
+  function t7() → core::Object
+    return throw "";
+  function t8() → core::int
+    return throw "";
+  function s1() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s2() → self::G<dynamic>
+    return throw "";
+  function s3() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s4() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s5() → self::G<self::ConcreteClass>
+    return throw "";
+  function s6() → self::G<self::Class<self::ConcreteClass>>
+    return throw "";
+  function s7() → self::G<core::Object>
+    return throw "";
+  function s8() → self::G<core::int>
+    return throw "";
+}
+static method Extension1|t1(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t1(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t1(#this);
+static method Extension1|t2(lowered final core::int #this) → dynamic
+  return throw "";
+static method Extension1|get#t2(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Extension1|t2(#this);
+static method Extension1|t3(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t3(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t3(#this);
+static method Extension1|t4(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t4(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t4(#this);
+static method Extension1|t5(lowered final core::int #this) → self::ConcreteClass
+  return throw "";
+static method Extension1|get#t5(lowered final core::int #this) → () → self::ConcreteClass
+  return () → self::ConcreteClass => self::Extension1|t5(#this);
+static method Extension1|t6(lowered final core::int #this) → self::Class<self::ConcreteClass>
+  return throw "";
+static method Extension1|get#t6(lowered final core::int #this) → () → self::Class<self::ConcreteClass>
+  return () → self::Class<self::ConcreteClass> => self::Extension1|t6(#this);
+static method Extension1|t7(lowered final core::int #this) → core::Object
+  return throw "";
+static method Extension1|get#t7(lowered final core::int #this) → () → core::Object
+  return () → core::Object => self::Extension1|t7(#this);
+static method Extension1|t8(lowered final core::int #this) → core::int
+  return throw "";
+static method Extension1|get#t8(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension1|t8(#this);
+static method Extension1|s1(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s1(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s1(#this);
+static method Extension1|s2(lowered final core::int #this) → self::G<dynamic>
+  return throw "";
+static method Extension1|get#s2(lowered final core::int #this) → () → self::G<dynamic>
+  return () → self::G<dynamic> => self::Extension1|s2(#this);
+static method Extension1|s3(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s3(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s3(#this);
+static method Extension1|s4(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s4(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s4(#this);
+static method Extension1|s5(lowered final core::int #this) → self::G<self::ConcreteClass>
+  return throw "";
+static method Extension1|get#s5(lowered final core::int #this) → () → self::G<self::ConcreteClass>
+  return () → self::G<self::ConcreteClass> => self::Extension1|s5(#this);
+static method Extension1|s6(lowered final core::int #this) → self::G<self::Class<self::ConcreteClass>>
+  return throw "";
+static method Extension1|get#s6(lowered final core::int #this) → () → self::G<self::Class<self::ConcreteClass>>
+  return () → self::G<self::Class<self::ConcreteClass>> => self::Extension1|s6(#this);
+static method Extension1|s7(lowered final core::int #this) → self::G<core::Object>
+  return throw "";
+static method Extension1|get#s7(lowered final core::int #this) → () → self::G<core::Object>
+  return () → self::G<core::Object> => self::Extension1|s7(#this);
+static method Extension1|s8(lowered final core::int #this) → self::G<core::int>
+  return throw "";
+static method Extension1|get#s8(lowered final core::int #this) → () → self::G<core::int>
+  return () → self::G<core::int> => self::Extension1|s8(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.modular.expect
new file mode 100644
index 0000000..6adeaf2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.modular.expect
@@ -0,0 +1,377 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_return_types.dart:19:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object> t7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:20:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int> t8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:27:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object> s7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:28:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int> s8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:56:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:57:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:64:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:65:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:75:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:76:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:83:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:84:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:37:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:38:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:45:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:46:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  method t1() → self::Class<dynamic>
+    return throw "";
+  method t2() → dynamic
+    return throw "";
+  method t3() → self::Class<dynamic>
+    return throw "";
+  method t4() → self::Class<dynamic>
+    return throw "";
+  method t5() → self::ConcreteClass
+    return throw "";
+  method t6() → self::Class<self::ConcreteClass>
+    return throw "";
+  method t7() → core::Object
+    return throw "";
+  method t8() → core::int
+    return throw "";
+  method s1() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s2() → self::G<dynamic>
+    return throw "";
+  method s3() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s4() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s5() → self::G<self::ConcreteClass>
+    return throw "";
+  method s6() → self::G<self::Class<self::ConcreteClass>>
+    return throw "";
+  method s7() → self::G<core::Object>
+    return throw "";
+  method s8() → self::G<core::int>
+    return throw "";
+}
+extension Extension1 on core::int {
+  method t1 = self::Extension1|t1;
+  tearoff t1 = self::Extension1|get#t1;
+  method t2 = self::Extension1|t2;
+  tearoff t2 = self::Extension1|get#t2;
+  method t3 = self::Extension1|t3;
+  tearoff t3 = self::Extension1|get#t3;
+  method t4 = self::Extension1|t4;
+  tearoff t4 = self::Extension1|get#t4;
+  method t5 = self::Extension1|t5;
+  tearoff t5 = self::Extension1|get#t5;
+  method t6 = self::Extension1|t6;
+  tearoff t6 = self::Extension1|get#t6;
+  method t7 = self::Extension1|t7;
+  tearoff t7 = self::Extension1|get#t7;
+  method t8 = self::Extension1|t8;
+  tearoff t8 = self::Extension1|get#t8;
+  method s1 = self::Extension1|s1;
+  tearoff s1 = self::Extension1|get#s1;
+  method s2 = self::Extension1|s2;
+  tearoff s2 = self::Extension1|get#s2;
+  method s3 = self::Extension1|s3;
+  tearoff s3 = self::Extension1|get#s3;
+  method s4 = self::Extension1|s4;
+  tearoff s4 = self::Extension1|get#s4;
+  method s5 = self::Extension1|s5;
+  tearoff s5 = self::Extension1|get#s5;
+  method s6 = self::Extension1|s6;
+  tearoff s6 = self::Extension1|get#s6;
+  method s7 = self::Extension1|s7;
+  tearoff s7 = self::Extension1|get#s7;
+  method s8 = self::Extension1|s8;
+  tearoff s8 = self::Extension1|get#s8;
+}
+static method t1() → self::Class<dynamic>
+  return throw "";
+static method t2() → dynamic
+  return throw "";
+static method t3() → self::Class<dynamic>
+  return throw "";
+static method t4() → self::Class<dynamic>
+  return throw "";
+static method t5() → self::ConcreteClass
+  return throw "";
+static method t6() → self::Class<self::ConcreteClass>
+  return throw "";
+static method t7() → core::Object
+  return throw "";
+static method t8() → core::int
+  return throw "";
+static method s1() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s2() → self::G<dynamic>
+  return throw "";
+static method s3() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s4() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s5() → self::G<self::ConcreteClass>
+  return throw "";
+static method s6() → self::G<self::Class<self::ConcreteClass>>
+  return throw "";
+static method s7() → self::G<core::Object>
+  return throw "";
+static method s8() → self::G<core::int>
+  return throw "";
+static method method1() → dynamic {
+  function t1() → self::Class<dynamic>
+    return throw "";
+  function t2() → dynamic
+    return throw "";
+  function t3() → self::Class<dynamic>
+    return throw "";
+  function t4() → self::Class<dynamic>
+    return throw "";
+  function t5() → self::ConcreteClass
+    return throw "";
+  function t6() → self::Class<self::ConcreteClass>
+    return throw "";
+  function t7() → core::Object
+    return throw "";
+  function t8() → core::int
+    return throw "";
+  function s1() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s2() → self::G<dynamic>
+    return throw "";
+  function s3() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s4() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s5() → self::G<self::ConcreteClass>
+    return throw "";
+  function s6() → self::G<self::Class<self::ConcreteClass>>
+    return throw "";
+  function s7() → self::G<core::Object>
+    return throw "";
+  function s8() → self::G<core::int>
+    return throw "";
+}
+static method Extension1|t1(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t1(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t1(#this);
+static method Extension1|t2(lowered final core::int #this) → dynamic
+  return throw "";
+static method Extension1|get#t2(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Extension1|t2(#this);
+static method Extension1|t3(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t3(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t3(#this);
+static method Extension1|t4(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t4(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t4(#this);
+static method Extension1|t5(lowered final core::int #this) → self::ConcreteClass
+  return throw "";
+static method Extension1|get#t5(lowered final core::int #this) → () → self::ConcreteClass
+  return () → self::ConcreteClass => self::Extension1|t5(#this);
+static method Extension1|t6(lowered final core::int #this) → self::Class<self::ConcreteClass>
+  return throw "";
+static method Extension1|get#t6(lowered final core::int #this) → () → self::Class<self::ConcreteClass>
+  return () → self::Class<self::ConcreteClass> => self::Extension1|t6(#this);
+static method Extension1|t7(lowered final core::int #this) → core::Object
+  return throw "";
+static method Extension1|get#t7(lowered final core::int #this) → () → core::Object
+  return () → core::Object => self::Extension1|t7(#this);
+static method Extension1|t8(lowered final core::int #this) → core::int
+  return throw "";
+static method Extension1|get#t8(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension1|t8(#this);
+static method Extension1|s1(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s1(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s1(#this);
+static method Extension1|s2(lowered final core::int #this) → self::G<dynamic>
+  return throw "";
+static method Extension1|get#s2(lowered final core::int #this) → () → self::G<dynamic>
+  return () → self::G<dynamic> => self::Extension1|s2(#this);
+static method Extension1|s3(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s3(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s3(#this);
+static method Extension1|s4(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s4(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s4(#this);
+static method Extension1|s5(lowered final core::int #this) → self::G<self::ConcreteClass>
+  return throw "";
+static method Extension1|get#s5(lowered final core::int #this) → () → self::G<self::ConcreteClass>
+  return () → self::G<self::ConcreteClass> => self::Extension1|s5(#this);
+static method Extension1|s6(lowered final core::int #this) → self::G<self::Class<self::ConcreteClass>>
+  return throw "";
+static method Extension1|get#s6(lowered final core::int #this) → () → self::G<self::Class<self::ConcreteClass>>
+  return () → self::G<self::Class<self::ConcreteClass>> => self::Extension1|s6(#this);
+static method Extension1|s7(lowered final core::int #this) → self::G<core::Object>
+  return throw "";
+static method Extension1|get#s7(lowered final core::int #this) → () → self::G<core::Object>
+  return () → self::G<core::Object> => self::Extension1|s7(#this);
+static method Extension1|s8(lowered final core::int #this) → self::G<core::int>
+  return throw "";
+static method Extension1|get#s8(lowered final core::int #this) → () → self::G<core::int>
+  return () → self::G<core::int> => self::Extension1|s8(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.outline.expect
new file mode 100644
index 0000000..4d68a21
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.outline.expect
@@ -0,0 +1,304 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_return_types.dart:19:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object> t7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:20:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int> t8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:27:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object> s7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:28:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int> s8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:56:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:57:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:64:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:65:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:75:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:76:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:83:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:84:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    ;
+  method t1() → self::Class<dynamic>
+    ;
+  method t2() → dynamic
+    ;
+  method t3() → self::Class<dynamic>
+    ;
+  method t4() → self::Class<dynamic>
+    ;
+  method t5() → self::ConcreteClass
+    ;
+  method t6() → self::Class<self::ConcreteClass>
+    ;
+  method t7() → core::Object
+    ;
+  method t8() → core::int
+    ;
+  method s1() → self::G<self::Class<dynamic>>
+    ;
+  method s2() → self::G<dynamic>
+    ;
+  method s3() → self::G<self::Class<dynamic>>
+    ;
+  method s4() → self::G<self::Class<dynamic>>
+    ;
+  method s5() → self::G<self::ConcreteClass>
+    ;
+  method s6() → self::G<self::Class<self::ConcreteClass>>
+    ;
+  method s7() → self::G<core::Object>
+    ;
+  method s8() → self::G<core::int>
+    ;
+}
+extension Extension1 on core::int {
+  method t1 = self::Extension1|t1;
+  tearoff t1 = self::Extension1|get#t1;
+  method t2 = self::Extension1|t2;
+  tearoff t2 = self::Extension1|get#t2;
+  method t3 = self::Extension1|t3;
+  tearoff t3 = self::Extension1|get#t3;
+  method t4 = self::Extension1|t4;
+  tearoff t4 = self::Extension1|get#t4;
+  method t5 = self::Extension1|t5;
+  tearoff t5 = self::Extension1|get#t5;
+  method t6 = self::Extension1|t6;
+  tearoff t6 = self::Extension1|get#t6;
+  method t7 = self::Extension1|t7;
+  tearoff t7 = self::Extension1|get#t7;
+  method t8 = self::Extension1|t8;
+  tearoff t8 = self::Extension1|get#t8;
+  method s1 = self::Extension1|s1;
+  tearoff s1 = self::Extension1|get#s1;
+  method s2 = self::Extension1|s2;
+  tearoff s2 = self::Extension1|get#s2;
+  method s3 = self::Extension1|s3;
+  tearoff s3 = self::Extension1|get#s3;
+  method s4 = self::Extension1|s4;
+  tearoff s4 = self::Extension1|get#s4;
+  method s5 = self::Extension1|s5;
+  tearoff s5 = self::Extension1|get#s5;
+  method s6 = self::Extension1|s6;
+  tearoff s6 = self::Extension1|get#s6;
+  method s7 = self::Extension1|s7;
+  tearoff s7 = self::Extension1|get#s7;
+  method s8 = self::Extension1|s8;
+  tearoff s8 = self::Extension1|get#s8;
+}
+static method t1() → self::Class<dynamic>
+  ;
+static method t2() → dynamic
+  ;
+static method t3() → self::Class<dynamic>
+  ;
+static method t4() → self::Class<dynamic>
+  ;
+static method t5() → self::ConcreteClass
+  ;
+static method t6() → self::Class<self::ConcreteClass>
+  ;
+static method t7() → core::Object
+  ;
+static method t8() → core::int
+  ;
+static method s1() → self::G<self::Class<dynamic>>
+  ;
+static method s2() → self::G<dynamic>
+  ;
+static method s3() → self::G<self::Class<dynamic>>
+  ;
+static method s4() → self::G<self::Class<dynamic>>
+  ;
+static method s5() → self::G<self::ConcreteClass>
+  ;
+static method s6() → self::G<self::Class<self::ConcreteClass>>
+  ;
+static method s7() → self::G<core::Object>
+  ;
+static method s8() → self::G<core::int>
+  ;
+static method method1() → dynamic
+  ;
+static method Extension1|t1(lowered final core::int #this) → self::Class<dynamic>
+  ;
+static method Extension1|get#t1(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t1(#this);
+static method Extension1|t2(lowered final core::int #this) → dynamic
+  ;
+static method Extension1|get#t2(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Extension1|t2(#this);
+static method Extension1|t3(lowered final core::int #this) → self::Class<dynamic>
+  ;
+static method Extension1|get#t3(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t3(#this);
+static method Extension1|t4(lowered final core::int #this) → self::Class<dynamic>
+  ;
+static method Extension1|get#t4(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t4(#this);
+static method Extension1|t5(lowered final core::int #this) → self::ConcreteClass
+  ;
+static method Extension1|get#t5(lowered final core::int #this) → () → self::ConcreteClass
+  return () → self::ConcreteClass => self::Extension1|t5(#this);
+static method Extension1|t6(lowered final core::int #this) → self::Class<self::ConcreteClass>
+  ;
+static method Extension1|get#t6(lowered final core::int #this) → () → self::Class<self::ConcreteClass>
+  return () → self::Class<self::ConcreteClass> => self::Extension1|t6(#this);
+static method Extension1|t7(lowered final core::int #this) → core::Object
+  ;
+static method Extension1|get#t7(lowered final core::int #this) → () → core::Object
+  return () → core::Object => self::Extension1|t7(#this);
+static method Extension1|t8(lowered final core::int #this) → core::int
+  ;
+static method Extension1|get#t8(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension1|t8(#this);
+static method Extension1|s1(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  ;
+static method Extension1|get#s1(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s1(#this);
+static method Extension1|s2(lowered final core::int #this) → self::G<dynamic>
+  ;
+static method Extension1|get#s2(lowered final core::int #this) → () → self::G<dynamic>
+  return () → self::G<dynamic> => self::Extension1|s2(#this);
+static method Extension1|s3(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  ;
+static method Extension1|get#s3(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s3(#this);
+static method Extension1|s4(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  ;
+static method Extension1|get#s4(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s4(#this);
+static method Extension1|s5(lowered final core::int #this) → self::G<self::ConcreteClass>
+  ;
+static method Extension1|get#s5(lowered final core::int #this) → () → self::G<self::ConcreteClass>
+  return () → self::G<self::ConcreteClass> => self::Extension1|s5(#this);
+static method Extension1|s6(lowered final core::int #this) → self::G<self::Class<self::ConcreteClass>>
+  ;
+static method Extension1|get#s6(lowered final core::int #this) → () → self::G<self::Class<self::ConcreteClass>>
+  return () → self::G<self::Class<self::ConcreteClass>> => self::Extension1|s6(#this);
+static method Extension1|s7(lowered final core::int #this) → self::G<core::Object>
+  ;
+static method Extension1|get#s7(lowered final core::int #this) → () → self::G<core::Object>
+  return () → self::G<core::Object> => self::Extension1|s7(#this);
+static method Extension1|s8(lowered final core::int #this) → self::G<core::int>
+  ;
+static method Extension1|get#s8(lowered final core::int #this) → () → self::G<core::int>
+  return () → self::G<core::int> => self::Extension1|s8(#this);
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_return_types.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.transformed.expect
new file mode 100644
index 0000000..6adeaf2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_return_types.dart.weak.transformed.expect
@@ -0,0 +1,377 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_return_types.dart:19:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<Object> t7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:20:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<int> t8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:27:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<Object> s7() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:28:1: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// G<int> s8() => throw ''; // Error
+// ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:56:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:57:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:64:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:65:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:75:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:76:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:83:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:84:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:37:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> t7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:38:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> t8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:45:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> s7() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.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_return_types.dart:46:3: 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_return_types.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> s8() => throw ''; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_return_types.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  method t1() → self::Class<dynamic>
+    return throw "";
+  method t2() → dynamic
+    return throw "";
+  method t3() → self::Class<dynamic>
+    return throw "";
+  method t4() → self::Class<dynamic>
+    return throw "";
+  method t5() → self::ConcreteClass
+    return throw "";
+  method t6() → self::Class<self::ConcreteClass>
+    return throw "";
+  method t7() → core::Object
+    return throw "";
+  method t8() → core::int
+    return throw "";
+  method s1() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s2() → self::G<dynamic>
+    return throw "";
+  method s3() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s4() → self::G<self::Class<dynamic>>
+    return throw "";
+  method s5() → self::G<self::ConcreteClass>
+    return throw "";
+  method s6() → self::G<self::Class<self::ConcreteClass>>
+    return throw "";
+  method s7() → self::G<core::Object>
+    return throw "";
+  method s8() → self::G<core::int>
+    return throw "";
+}
+extension Extension1 on core::int {
+  method t1 = self::Extension1|t1;
+  tearoff t1 = self::Extension1|get#t1;
+  method t2 = self::Extension1|t2;
+  tearoff t2 = self::Extension1|get#t2;
+  method t3 = self::Extension1|t3;
+  tearoff t3 = self::Extension1|get#t3;
+  method t4 = self::Extension1|t4;
+  tearoff t4 = self::Extension1|get#t4;
+  method t5 = self::Extension1|t5;
+  tearoff t5 = self::Extension1|get#t5;
+  method t6 = self::Extension1|t6;
+  tearoff t6 = self::Extension1|get#t6;
+  method t7 = self::Extension1|t7;
+  tearoff t7 = self::Extension1|get#t7;
+  method t8 = self::Extension1|t8;
+  tearoff t8 = self::Extension1|get#t8;
+  method s1 = self::Extension1|s1;
+  tearoff s1 = self::Extension1|get#s1;
+  method s2 = self::Extension1|s2;
+  tearoff s2 = self::Extension1|get#s2;
+  method s3 = self::Extension1|s3;
+  tearoff s3 = self::Extension1|get#s3;
+  method s4 = self::Extension1|s4;
+  tearoff s4 = self::Extension1|get#s4;
+  method s5 = self::Extension1|s5;
+  tearoff s5 = self::Extension1|get#s5;
+  method s6 = self::Extension1|s6;
+  tearoff s6 = self::Extension1|get#s6;
+  method s7 = self::Extension1|s7;
+  tearoff s7 = self::Extension1|get#s7;
+  method s8 = self::Extension1|s8;
+  tearoff s8 = self::Extension1|get#s8;
+}
+static method t1() → self::Class<dynamic>
+  return throw "";
+static method t2() → dynamic
+  return throw "";
+static method t3() → self::Class<dynamic>
+  return throw "";
+static method t4() → self::Class<dynamic>
+  return throw "";
+static method t5() → self::ConcreteClass
+  return throw "";
+static method t6() → self::Class<self::ConcreteClass>
+  return throw "";
+static method t7() → core::Object
+  return throw "";
+static method t8() → core::int
+  return throw "";
+static method s1() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s2() → self::G<dynamic>
+  return throw "";
+static method s3() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s4() → self::G<self::Class<dynamic>>
+  return throw "";
+static method s5() → self::G<self::ConcreteClass>
+  return throw "";
+static method s6() → self::G<self::Class<self::ConcreteClass>>
+  return throw "";
+static method s7() → self::G<core::Object>
+  return throw "";
+static method s8() → self::G<core::int>
+  return throw "";
+static method method1() → dynamic {
+  function t1() → self::Class<dynamic>
+    return throw "";
+  function t2() → dynamic
+    return throw "";
+  function t3() → self::Class<dynamic>
+    return throw "";
+  function t4() → self::Class<dynamic>
+    return throw "";
+  function t5() → self::ConcreteClass
+    return throw "";
+  function t6() → self::Class<self::ConcreteClass>
+    return throw "";
+  function t7() → core::Object
+    return throw "";
+  function t8() → core::int
+    return throw "";
+  function s1() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s2() → self::G<dynamic>
+    return throw "";
+  function s3() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s4() → self::G<self::Class<dynamic>>
+    return throw "";
+  function s5() → self::G<self::ConcreteClass>
+    return throw "";
+  function s6() → self::G<self::Class<self::ConcreteClass>>
+    return throw "";
+  function s7() → self::G<core::Object>
+    return throw "";
+  function s8() → self::G<core::int>
+    return throw "";
+}
+static method Extension1|t1(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t1(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t1(#this);
+static method Extension1|t2(lowered final core::int #this) → dynamic
+  return throw "";
+static method Extension1|get#t2(lowered final core::int #this) → () → dynamic
+  return () → dynamic => self::Extension1|t2(#this);
+static method Extension1|t3(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t3(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t3(#this);
+static method Extension1|t4(lowered final core::int #this) → self::Class<dynamic>
+  return throw "";
+static method Extension1|get#t4(lowered final core::int #this) → () → self::Class<dynamic>
+  return () → self::Class<dynamic> => self::Extension1|t4(#this);
+static method Extension1|t5(lowered final core::int #this) → self::ConcreteClass
+  return throw "";
+static method Extension1|get#t5(lowered final core::int #this) → () → self::ConcreteClass
+  return () → self::ConcreteClass => self::Extension1|t5(#this);
+static method Extension1|t6(lowered final core::int #this) → self::Class<self::ConcreteClass>
+  return throw "";
+static method Extension1|get#t6(lowered final core::int #this) → () → self::Class<self::ConcreteClass>
+  return () → self::Class<self::ConcreteClass> => self::Extension1|t6(#this);
+static method Extension1|t7(lowered final core::int #this) → core::Object
+  return throw "";
+static method Extension1|get#t7(lowered final core::int #this) → () → core::Object
+  return () → core::Object => self::Extension1|t7(#this);
+static method Extension1|t8(lowered final core::int #this) → core::int
+  return throw "";
+static method Extension1|get#t8(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension1|t8(#this);
+static method Extension1|s1(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s1(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s1(#this);
+static method Extension1|s2(lowered final core::int #this) → self::G<dynamic>
+  return throw "";
+static method Extension1|get#s2(lowered final core::int #this) → () → self::G<dynamic>
+  return () → self::G<dynamic> => self::Extension1|s2(#this);
+static method Extension1|s3(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s3(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s3(#this);
+static method Extension1|s4(lowered final core::int #this) → self::G<self::Class<dynamic>>
+  return throw "";
+static method Extension1|get#s4(lowered final core::int #this) → () → self::G<self::Class<dynamic>>
+  return () → self::G<self::Class<dynamic>> => self::Extension1|s4(#this);
+static method Extension1|s5(lowered final core::int #this) → self::G<self::ConcreteClass>
+  return throw "";
+static method Extension1|get#s5(lowered final core::int #this) → () → self::G<self::ConcreteClass>
+  return () → self::G<self::ConcreteClass> => self::Extension1|s5(#this);
+static method Extension1|s6(lowered final core::int #this) → self::G<self::Class<self::ConcreteClass>>
+  return throw "";
+static method Extension1|get#s6(lowered final core::int #this) → () → self::G<self::Class<self::ConcreteClass>>
+  return () → self::G<self::Class<self::ConcreteClass>> => self::Extension1|s6(#this);
+static method Extension1|s7(lowered final core::int #this) → self::G<core::Object>
+  return throw "";
+static method Extension1|get#s7(lowered final core::int #this) → () → self::G<core::Object>
+  return () → self::G<core::Object> => self::Extension1|s7(#this);
+static method Extension1|s8(lowered final core::int #this) → self::G<core::int>
+  return throw "";
+static method Extension1|get#s8(lowered final core::int #this) → () → self::G<core::int>
+  return () → self::G<core::int> => self::Extension1|s8(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart b/pkg/front_end/testcases/general/bounds_supertypes.dart
new file mode 100644
index 0000000..40f4ea1
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart
@@ -0,0 +1,237 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = Class<X>;
+
+class G<X extends Class<X>> {}
+
+class ExtendsT1 extends F {} // Error
+
+class ExtendsT2 extends F<dynamic> {} // Error
+
+class ExtendsT3 extends F<Class> {} // Error
+
+class ExtendsT4 extends F<Class<dynamic>> {} // Error
+
+class ExtendsT5 extends F<ConcreteClass> {} // Ok
+
+class ExtendsT6 extends F<Class<ConcreteClass>> {} // Ok
+
+class ExtendsT7 extends F<Object> {} // Error
+
+class ExtendsT8 extends F<int> {} // Error
+
+class ExtendsS1 extends G {} // Error
+
+class ExtendsS2 extends G<dynamic> {} // Error
+
+class ExtendsS3 extends G<Class> {} // Error
+
+class ExtendsS4 extends G<Class<dynamic>> {} // Error
+
+class ExtendsS5 extends G<ConcreteClass> {} // Ok
+
+class ExtendsS6 extends G<Class<ConcreteClass>> {} // Ok
+
+class ExtendsS7 extends G<Object> {} // Error
+
+class ExtendsS8 extends G<int> {} // Error
+
+class ImplementsT1 implements F {} // Error
+
+class ImplementsT2 implements F<dynamic> {} // Error
+
+class ImplementsT3 implements F<Class> {} // Error
+
+class ImplementsT4 implements F<Class<dynamic>> {} // Error
+
+class ImplementsT5 implements F<ConcreteClass> {} // Ok
+
+class ImplementsT6 implements F<Class<ConcreteClass>> {} // Ok
+
+class ImplementsT7 implements F<Object> {} // Error
+
+class ImplementsT8 implements F<int> {} // Error
+
+class ImplementsS1 implements G {} // Error
+
+class ImplementsS2 implements G<dynamic> {} // Error
+
+class ImplementsS3 implements G<Class> {} // Error
+
+class ImplementsS4 implements G<Class<dynamic>> {} // Error
+
+class ImplementsS5 implements G<ConcreteClass> {} // Ok
+
+class ImplementsS6 implements G<Class<ConcreteClass>> {} // Ok
+
+class ImplementsS7 implements G<Object> {} // Error
+
+class ImplementsS8 implements G<int> {} // Error
+
+class WithT1 with F {} // Error
+
+class WithT2 with F<dynamic> {} // Error
+
+class WithT3 with F<Class> {} // Error
+
+class WithT4 with F<Class<dynamic>> {} // Error
+
+class WithT5 with F<ConcreteClass> {} // Ok
+
+class WithT6 with F<Class<ConcreteClass>> {} // Ok
+
+class WithT7 with F<Object> {} // Error
+
+class WithT8 with F<int> {} // Error
+
+class WithS1 with G {} // Error
+
+class WithS2 with G<dynamic> {} // Error
+
+class WithS3 with G<Class> {} // Error
+
+class WithS4 with G<Class<dynamic>> {} // Error
+
+class WithS5 with G<ConcreteClass> {} // Ok
+
+class WithS6 with G<Class<ConcreteClass>> {} // Ok
+
+class WithS7 with G<Object> {} // Error
+
+class WithS8 with G<int> {} // Error
+
+enum EnumImplementsT1 implements F /* Error */ { a }
+
+enum EnumImplementsT2 implements F<dynamic> /* Error */ { a }
+
+enum EnumImplementsT3 implements F<Class> /* Error */ { a }
+
+enum EnumImplementsT4 implements F<Class<dynamic>> /* Error */ { a }
+
+enum EnumImplementsT5 implements F<ConcreteClass> /* Ok */ { a }
+
+enum EnumImplementsT6 implements F<Class<ConcreteClass>> /* Ok */ { a }
+
+enum EnumImplementsT7 implements F<Object> /* Error */ { a }
+
+enum EnumImplementsT8 implements F<int> /* Error */ { a }
+
+enum EnumImplementsS1 implements G /* Error */ { a }
+
+enum EnumImplementsS2 implements G<dynamic> /* Error */ { a }
+
+enum EnumImplementsS3 implements G<Class> /* Error */ { a }
+
+enum EnumImplementsS4 implements G<Class<dynamic>> /* Error */ { a }
+
+enum EnumImplementsS5 implements G<ConcreteClass> /* Ok */ { a }
+
+enum EnumImplementsS6 implements G<Class<ConcreteClass>> /* Ok */ { a }
+
+enum EnumImplementsS7 implements G<Object> /* Error */ { a }
+
+enum EnumImplementsS8 implements G<int> /* Error */ { a }
+
+enum EnumWithT1 with F /* Error */ { a }
+
+enum EnumWithT2 with F<dynamic> /* Error */ { a }
+
+enum EnumWithT3 with F<Class> /* Error */ { a }
+
+enum EnumWithT4 with F<Class<dynamic>> /* Error */ { a }
+
+enum EnumWithT5 with F<ConcreteClass> /* Ok */ { a }
+
+enum EnumWithT6 with F<Class<ConcreteClass>> /* Ok */ { a }
+
+enum EnumWithT7 with F<Object> /* Error */ { a }
+
+enum EnumWithT8 with F<int> /* Error */ { a }
+
+enum EnumWithS1 with G /* Error */ { a }
+
+enum EnumWithS2 with G<dynamic> /* Error */ { a }
+
+enum EnumWithS3 with G<Class> /* Error */ { a }
+
+enum EnumWithS4 with G<Class<dynamic>> /* Error */ { a }
+
+enum EnumWithS5 with G<ConcreteClass> /* Ok */ { a }
+
+enum EnumWithS6 with G<Class<ConcreteClass>> /* Ok */ { a }
+
+enum EnumWithS7 with G<Object> /* Error */ { a }
+
+enum EnumWithS8 with G<int> /* Error */ { a }
+
+mixin MixinOnT1 on F {} // Error
+
+mixin MixinOnT2 on F<dynamic> {} // Error
+
+mixin MixinOnT3 on F<Class> {} // Error
+
+mixin MixinOnT4 on F<Class<dynamic>> {} // Error
+
+mixin MixinOnT5 on F<ConcreteClass> {} // Ok
+
+mixin MixinOnT6 on F<Class<ConcreteClass>> {} // Ok
+
+mixin MixinOnT7 on F<Object> {} // Error
+
+mixin MixinOnT8 on F<int> {} // Error
+
+mixin MixinOnS1 on G {} // Error
+
+mixin MixinOnS2 on G<dynamic> {} // Error
+
+mixin MixinOnS3 on G<Class> {} // Error
+
+mixin MixinOnS4 on G<Class<dynamic>> {} // Error
+
+mixin MixinOnS5 on G<ConcreteClass> {} // Ok
+
+mixin MixinOnS6 on G<Class<ConcreteClass>> {} // Ok
+
+mixin MixinOnS7 on G<Object> {} // Error
+
+mixin MixinOnS8 on G<int> {} // Error
+
+extension ExtensionOnT1 on F {} // Ok
+
+extension ExtensionOnT2 on F<dynamic> {} // Ok
+
+extension ExtensionOnT3 on F<Class> {} // Ok
+
+extension ExtensionOnT4 on F<Class<dynamic>> {} // Ok
+
+extension ExtensionOnT5 on F<ConcreteClass> {} // Ok
+
+extension ExtensionOnT6 on F<Class<ConcreteClass>> {} // Ok
+
+extension ExtensionOnT7 on F<Object> {} // Error
+
+extension ExtensionOnT8 on F<int> {} // Error
+
+extension ExtensionOnS1 on G {} // Ok
+
+extension ExtensionOnS2 on G<dynamic> {} // Ok
+
+extension ExtensionOnS3 on G<Class> {} // Ok
+
+extension ExtensionOnS4 on G<Class<dynamic>> {} // Ok
+
+extension ExtensionOnS5 on G<ConcreteClass> {} // Ok
+
+extension ExtensionOnS6 on G<Class<ConcreteClass>> {} // Ok
+
+extension ExtensionOnS7 on G<Object> {} // Error
+
+extension ExtensionOnS8 on G<int> {} // Error
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.textual_outline.expect
new file mode 100644
index 0000000..411c612
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.textual_outline.expect
@@ -0,0 +1,218 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = Class<X>;
+
+class G<X extends Class<X>> {}
+
+class ExtendsT1 extends F {}
+
+class ExtendsT2 extends F<dynamic> {}
+
+class ExtendsT3 extends F<Class> {}
+
+class ExtendsT4 extends F<Class<dynamic>> {}
+
+class ExtendsT5 extends F<ConcreteClass> {}
+
+class ExtendsT6 extends F<Class<ConcreteClass>> {}
+
+class ExtendsT7 extends F<Object> {}
+
+class ExtendsT8 extends F<int> {}
+
+class ExtendsS1 extends G {}
+
+class ExtendsS2 extends G<dynamic> {}
+
+class ExtendsS3 extends G<Class> {}
+
+class ExtendsS4 extends G<Class<dynamic>> {}
+
+class ExtendsS5 extends G<ConcreteClass> {}
+
+class ExtendsS6 extends G<Class<ConcreteClass>> {}
+
+class ExtendsS7 extends G<Object> {}
+
+class ExtendsS8 extends G<int> {}
+
+class ImplementsT1 implements F {}
+
+class ImplementsT2 implements F<dynamic> {}
+
+class ImplementsT3 implements F<Class> {}
+
+class ImplementsT4 implements F<Class<dynamic>> {}
+
+class ImplementsT5 implements F<ConcreteClass> {}
+
+class ImplementsT6 implements F<Class<ConcreteClass>> {}
+
+class ImplementsT7 implements F<Object> {}
+
+class ImplementsT8 implements F<int> {}
+
+class ImplementsS1 implements G {}
+
+class ImplementsS2 implements G<dynamic> {}
+
+class ImplementsS3 implements G<Class> {}
+
+class ImplementsS4 implements G<Class<dynamic>> {}
+
+class ImplementsS5 implements G<ConcreteClass> {}
+
+class ImplementsS6 implements G<Class<ConcreteClass>> {}
+
+class ImplementsS7 implements G<Object> {}
+
+class ImplementsS8 implements G<int> {}
+
+class WithT1 with F {}
+
+class WithT2 with F<dynamic> {}
+
+class WithT3 with F<Class> {}
+
+class WithT4 with F<Class<dynamic>> {}
+
+class WithT5 with F<ConcreteClass> {}
+
+class WithT6 with F<Class<ConcreteClass>> {}
+
+class WithT7 with F<Object> {}
+
+class WithT8 with F<int> {}
+
+class WithS1 with G {}
+
+class WithS2 with G<dynamic> {}
+
+class WithS3 with G<Class> {}
+
+class WithS4 with G<Class<dynamic>> {}
+
+class WithS5 with G<ConcreteClass> {}
+
+class WithS6 with G<Class<ConcreteClass>> {}
+
+class WithS7 with G<Object> {}
+
+class WithS8 with G<int> {}
+
+enum EnumImplementsT1 implements F { a }
+
+enum EnumImplementsT2 implements F<dynamic> { a }
+
+enum EnumImplementsT3 implements F<Class> { a }
+
+enum EnumImplementsT4 implements F<Class<dynamic>> { a }
+
+enum EnumImplementsT5 implements F<ConcreteClass> { a }
+
+enum EnumImplementsT6 implements F<Class<ConcreteClass>> { a }
+
+enum EnumImplementsT7 implements F<Object> { a }
+
+enum EnumImplementsT8 implements F<int> { a }
+
+enum EnumImplementsS1 implements G { a }
+
+enum EnumImplementsS2 implements G<dynamic> { a }
+
+enum EnumImplementsS3 implements G<Class> { a }
+
+enum EnumImplementsS4 implements G<Class<dynamic>> { a }
+
+enum EnumImplementsS5 implements G<ConcreteClass> { a }
+
+enum EnumImplementsS6 implements G<Class<ConcreteClass>> { a }
+
+enum EnumImplementsS7 implements G<Object> { a }
+
+enum EnumImplementsS8 implements G<int> { a }
+
+enum EnumWithT1 with F { a }
+
+enum EnumWithT2 with F<dynamic> { a }
+
+enum EnumWithT3 with F<Class> { a }
+
+enum EnumWithT4 with F<Class<dynamic>> { a }
+
+enum EnumWithT5 with F<ConcreteClass> { a }
+
+enum EnumWithT6 with F<Class<ConcreteClass>> { a }
+
+enum EnumWithT7 with F<Object> { a }
+
+enum EnumWithT8 with F<int> { a }
+
+enum EnumWithS1 with G { a }
+
+enum EnumWithS2 with G<dynamic> { a }
+
+enum EnumWithS3 with G<Class> { a }
+
+enum EnumWithS4 with G<Class<dynamic>> { a }
+
+enum EnumWithS5 with G<ConcreteClass> { a }
+
+enum EnumWithS6 with G<Class<ConcreteClass>> { a }
+
+enum EnumWithS7 with G<Object> { a }
+
+enum EnumWithS8 with G<int> { a }
+
+mixin MixinOnT1 on F {}
+mixin MixinOnT2 on F<dynamic> {}
+mixin MixinOnT3 on F<Class> {}
+mixin MixinOnT4 on F<Class<dynamic>> {}
+mixin MixinOnT5 on F<ConcreteClass> {}
+mixin MixinOnT6 on F<Class<ConcreteClass>> {}
+mixin MixinOnT7 on F<Object> {}
+mixin MixinOnT8 on F<int> {}
+mixin MixinOnS1 on G {}
+mixin MixinOnS2 on G<dynamic> {}
+mixin MixinOnS3 on G<Class> {}
+mixin MixinOnS4 on G<Class<dynamic>> {}
+mixin MixinOnS5 on G<ConcreteClass> {}
+mixin MixinOnS6 on G<Class<ConcreteClass>> {}
+mixin MixinOnS7 on G<Object> {}
+mixin MixinOnS8 on G<int> {}
+
+extension ExtensionOnT1 on F {}
+
+extension ExtensionOnT2 on F<dynamic> {}
+
+extension ExtensionOnT3 on F<Class> {}
+
+extension ExtensionOnT4 on F<Class<dynamic>> {}
+
+extension ExtensionOnT5 on F<ConcreteClass> {}
+
+extension ExtensionOnT6 on F<Class<ConcreteClass>> {}
+
+extension ExtensionOnT7 on F<Object> {}
+
+extension ExtensionOnT8 on F<int> {}
+
+extension ExtensionOnS1 on G {}
+
+extension ExtensionOnS2 on G<dynamic> {}
+
+extension ExtensionOnS3 on G<Class> {}
+
+extension ExtensionOnS4 on G<Class<dynamic>> {}
+
+extension ExtensionOnS5 on G<ConcreteClass> {}
+
+extension ExtensionOnS6 on G<Class<ConcreteClass>> {}
+
+extension ExtensionOnS7 on G<Object> {}
+
+extension ExtensionOnS8 on G<int> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5203bb6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.textual_outline_modelled.expect
@@ -0,0 +1,216 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class ExtendsS1 extends G {}
+
+class ExtendsS2 extends G<dynamic> {}
+
+class ExtendsS3 extends G<Class> {}
+
+class ExtendsS4 extends G<Class<dynamic>> {}
+
+class ExtendsS5 extends G<ConcreteClass> {}
+
+class ExtendsS6 extends G<Class<ConcreteClass>> {}
+
+class ExtendsS7 extends G<Object> {}
+
+class ExtendsS8 extends G<int> {}
+
+class ExtendsT1 extends F {}
+
+class ExtendsT2 extends F<dynamic> {}
+
+class ExtendsT3 extends F<Class> {}
+
+class ExtendsT4 extends F<Class<dynamic>> {}
+
+class ExtendsT5 extends F<ConcreteClass> {}
+
+class ExtendsT6 extends F<Class<ConcreteClass>> {}
+
+class ExtendsT7 extends F<Object> {}
+
+class ExtendsT8 extends F<int> {}
+
+class G<X extends Class<X>> {}
+
+class ImplementsS1 implements G {}
+
+class ImplementsS2 implements G<dynamic> {}
+
+class ImplementsS3 implements G<Class> {}
+
+class ImplementsS4 implements G<Class<dynamic>> {}
+
+class ImplementsS5 implements G<ConcreteClass> {}
+
+class ImplementsS6 implements G<Class<ConcreteClass>> {}
+
+class ImplementsS7 implements G<Object> {}
+
+class ImplementsS8 implements G<int> {}
+
+class ImplementsT1 implements F {}
+
+class ImplementsT2 implements F<dynamic> {}
+
+class ImplementsT3 implements F<Class> {}
+
+class ImplementsT4 implements F<Class<dynamic>> {}
+
+class ImplementsT5 implements F<ConcreteClass> {}
+
+class ImplementsT6 implements F<Class<ConcreteClass>> {}
+
+class ImplementsT7 implements F<Object> {}
+
+class ImplementsT8 implements F<int> {}
+
+class WithS1 with G {}
+
+class WithS2 with G<dynamic> {}
+
+class WithS3 with G<Class> {}
+
+class WithS4 with G<Class<dynamic>> {}
+
+class WithS5 with G<ConcreteClass> {}
+
+class WithS6 with G<Class<ConcreteClass>> {}
+
+class WithS7 with G<Object> {}
+
+class WithS8 with G<int> {}
+
+class WithT1 with F {}
+
+class WithT2 with F<dynamic> {}
+
+class WithT3 with F<Class> {}
+
+class WithT4 with F<Class<dynamic>> {}
+
+class WithT5 with F<ConcreteClass> {}
+
+class WithT6 with F<Class<ConcreteClass>> {}
+
+class WithT7 with F<Object> {}
+
+class WithT8 with F<int> {}
+
+enum EnumImplementsS1 implements G { a }
+
+enum EnumImplementsS2 implements G<dynamic> { a }
+
+enum EnumImplementsS3 implements G<Class> { a }
+
+enum EnumImplementsS4 implements G<Class<dynamic>> { a }
+
+enum EnumImplementsS5 implements G<ConcreteClass> { a }
+
+enum EnumImplementsS6 implements G<Class<ConcreteClass>> { a }
+
+enum EnumImplementsS7 implements G<Object> { a }
+
+enum EnumImplementsS8 implements G<int> { a }
+
+enum EnumImplementsT1 implements F { a }
+
+enum EnumImplementsT2 implements F<dynamic> { a }
+
+enum EnumImplementsT3 implements F<Class> { a }
+
+enum EnumImplementsT4 implements F<Class<dynamic>> { a }
+
+enum EnumImplementsT5 implements F<ConcreteClass> { a }
+
+enum EnumImplementsT6 implements F<Class<ConcreteClass>> { a }
+
+enum EnumImplementsT7 implements F<Object> { a }
+
+enum EnumImplementsT8 implements F<int> { a }
+
+enum EnumWithS1 with G { a }
+
+enum EnumWithS2 with G<dynamic> { a }
+
+enum EnumWithS3 with G<Class> { a }
+
+enum EnumWithS4 with G<Class<dynamic>> { a }
+
+enum EnumWithS5 with G<ConcreteClass> { a }
+
+enum EnumWithS6 with G<Class<ConcreteClass>> { a }
+
+enum EnumWithS7 with G<Object> { a }
+
+enum EnumWithS8 with G<int> { a }
+
+enum EnumWithT1 with F { a }
+
+enum EnumWithT2 with F<dynamic> { a }
+
+enum EnumWithT3 with F<Class> { a }
+
+enum EnumWithT4 with F<Class<dynamic>> { a }
+
+enum EnumWithT5 with F<ConcreteClass> { a }
+
+enum EnumWithT6 with F<Class<ConcreteClass>> { a }
+
+enum EnumWithT7 with F<Object> { a }
+
+enum EnumWithT8 with F<int> { a }
+
+extension ExtensionOnS1 on G {}
+
+extension ExtensionOnS2 on G<dynamic> {}
+
+extension ExtensionOnS3 on G<Class> {}
+
+extension ExtensionOnS4 on G<Class<dynamic>> {}
+
+extension ExtensionOnS5 on G<ConcreteClass> {}
+
+extension ExtensionOnS6 on G<Class<ConcreteClass>> {}
+
+extension ExtensionOnS7 on G<Object> {}
+
+extension ExtensionOnS8 on G<int> {}
+
+extension ExtensionOnT1 on F {}
+
+extension ExtensionOnT2 on F<dynamic> {}
+
+extension ExtensionOnT3 on F<Class> {}
+
+extension ExtensionOnT4 on F<Class<dynamic>> {}
+
+extension ExtensionOnT5 on F<ConcreteClass> {}
+
+extension ExtensionOnT6 on F<Class<ConcreteClass>> {}
+
+extension ExtensionOnT7 on F<Object> {}
+
+extension ExtensionOnT8 on F<int> {}
+
+main() {}
+mixin MixinOnS1 on G {}
+mixin MixinOnS2 on G<dynamic> {}
+mixin MixinOnS3 on G<Class> {}
+mixin MixinOnS4 on G<Class<dynamic>> {}
+mixin MixinOnS5 on G<ConcreteClass> {}
+mixin MixinOnS6 on G<Class<ConcreteClass>> {}
+mixin MixinOnS7 on G<Object> {}
+mixin MixinOnS8 on G<int> {}
+mixin MixinOnT1 on F {}
+mixin MixinOnT2 on F<dynamic> {}
+mixin MixinOnT3 on F<Class> {}
+mixin MixinOnT4 on F<Class<dynamic>> {}
+mixin MixinOnT5 on F<ConcreteClass> {}
+mixin MixinOnT6 on F<Class<ConcreteClass>> {}
+mixin MixinOnT7 on F<Object> {}
+mixin MixinOnT8 on F<int> {}
+typedef F<X extends Class<X>> = Class<X>;
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.expect
new file mode 100644
index 0000000..4b8667d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.expect
@@ -0,0 +1,1599 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:13:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsT1 extends F {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:15:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT2 extends F<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:17:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT3 extends F<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:19:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT4 extends F<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:25:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT7 extends F<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:27:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT8 extends F<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:29:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsS1 extends G {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:31:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS2 extends G<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:33:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS3 extends G<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:35:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS4 extends G<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:41:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS7 extends G<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:43:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS8 extends G<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:45:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsT1 implements F {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:47:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT2 implements F<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:49:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT3 implements F<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:51:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT4 implements F<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:57:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT7 implements F<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:59:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT8 implements F<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:61:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsS1 implements G {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:63:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS2 implements G<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:65:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS3 implements G<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:67:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS4 implements G<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:73:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS7 implements G<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:75:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS8 implements G<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:77:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithT1 with F {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:79:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT2 with F<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:81:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT3 with F<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:83:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT4 with F<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:89: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT7 with F<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:91: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT8 with F<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:109:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsT1 implements F /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:111:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT2 implements F<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:113:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT3 implements F<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:115:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT4 implements F<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:121:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT7 implements F<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:123:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT8 implements F<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:125:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsS1 implements G /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:127:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS2 implements G<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:129:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS3 implements G<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:131:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS4 implements G<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:137:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS7 implements G<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:139:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS8 implements G<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:141:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithT1 with F /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:143:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT2 with F<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:145:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT3 with F<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:147:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT4 with F<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:153:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT7 with F<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:155:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT8 with F<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:173:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnT1 on F {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:175:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT2 on F<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:177:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT3 on F<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:179:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT4 on F<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:185: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT7 on F<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:187: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT8 on F<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:189:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnS1 on G {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:191:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS2 on G<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:193:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS3 on G<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:195:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS4 on G<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:201: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS7 on G<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:203: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS8 on G<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:217:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT7 on F<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:219:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT8 on F<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:233:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS7 on G<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:235:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS8 on G<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:93:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithS1 with G {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:95:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS2 with G<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:97:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS3 with G<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:99:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS4 with G<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:105:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS7 with G<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:107:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS8 with G<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:157:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithS1 with G /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:159:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS2 with G<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:161:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS3 with G<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:163:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS4 with G<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:169: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS7 with G<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:171: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS8 with G<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = self::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class ExtendsT1 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT1
+    : super self::Class::•()
+    ;
+}
+class ExtendsT2 extends self::Class<dynamic> {
+  synthetic constructor •() → self::ExtendsT2
+    : super self::Class::•()
+    ;
+}
+class ExtendsT3 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT3
+    : super self::Class::•()
+    ;
+}
+class ExtendsT4 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT4
+    : super self::Class::•()
+    ;
+}
+class ExtendsT5 extends self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsT5
+    : super self::Class::•()
+    ;
+}
+class ExtendsT6 extends self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsT6
+    : super self::Class::•()
+    ;
+}
+class ExtendsT7 extends self::Class<core::Object> {
+  synthetic constructor •() → self::ExtendsT7
+    : super self::Class::•()
+    ;
+}
+class ExtendsT8 extends self::Class<core::int> {
+  synthetic constructor •() → self::ExtendsT8
+    : super self::Class::•()
+    ;
+}
+class ExtendsS1 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS1
+    : super self::G::•()
+    ;
+}
+class ExtendsS2 extends self::G<dynamic> {
+  synthetic constructor •() → self::ExtendsS2
+    : super self::G::•()
+    ;
+}
+class ExtendsS3 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS3
+    : super self::G::•()
+    ;
+}
+class ExtendsS4 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS4
+    : super self::G::•()
+    ;
+}
+class ExtendsS5 extends self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsS5
+    : super self::G::•()
+    ;
+}
+class ExtendsS6 extends self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsS6
+    : super self::G::•()
+    ;
+}
+class ExtendsS7 extends self::G<core::Object> {
+  synthetic constructor •() → self::ExtendsS7
+    : super self::G::•()
+    ;
+}
+class ExtendsS8 extends self::G<core::int> {
+  synthetic constructor •() → self::ExtendsS8
+    : super self::G::•()
+    ;
+}
+class ImplementsT1 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT1
+    : super core::Object::•()
+    ;
+}
+class ImplementsT2 extends core::Object implements self::Class<dynamic> {
+  synthetic constructor •() → self::ImplementsT2
+    : super core::Object::•()
+    ;
+}
+class ImplementsT3 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT3
+    : super core::Object::•()
+    ;
+}
+class ImplementsT4 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT4
+    : super core::Object::•()
+    ;
+}
+class ImplementsT5 extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsT5
+    : super core::Object::•()
+    ;
+}
+class ImplementsT6 extends core::Object implements self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsT6
+    : super core::Object::•()
+    ;
+}
+class ImplementsT7 extends core::Object implements self::Class<core::Object> {
+  synthetic constructor •() → self::ImplementsT7
+    : super core::Object::•()
+    ;
+}
+class ImplementsT8 extends core::Object implements self::Class<core::int> {
+  synthetic constructor •() → self::ImplementsT8
+    : super core::Object::•()
+    ;
+}
+class ImplementsS1 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS1
+    : super core::Object::•()
+    ;
+}
+class ImplementsS2 extends core::Object implements self::G<dynamic> {
+  synthetic constructor •() → self::ImplementsS2
+    : super core::Object::•()
+    ;
+}
+class ImplementsS3 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS3
+    : super core::Object::•()
+    ;
+}
+class ImplementsS4 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS4
+    : super core::Object::•()
+    ;
+}
+class ImplementsS5 extends core::Object implements self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsS5
+    : super core::Object::•()
+    ;
+}
+class ImplementsS6 extends core::Object implements self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsS6
+    : super core::Object::•()
+    ;
+}
+class ImplementsS7 extends core::Object implements self::G<core::Object> {
+  synthetic constructor •() → self::ImplementsS7
+    : super core::Object::•()
+    ;
+}
+class ImplementsS8 extends core::Object implements self::G<core::int> {
+  synthetic constructor •() → self::ImplementsS8
+    : super core::Object::•()
+    ;
+}
+abstract class _WithT1&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT1&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT1 extends self::_WithT1&Object&F {
+  synthetic constructor •() → self::WithT1
+    : super self::_WithT1&Object&F::•()
+    ;
+}
+abstract class _WithT2&Object&F = core::Object with self::Class<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT2&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT2 extends self::_WithT2&Object&F {
+  synthetic constructor •() → self::WithT2
+    : super self::_WithT2&Object&F::•()
+    ;
+}
+abstract class _WithT3&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT3&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT3 extends self::_WithT3&Object&F {
+  synthetic constructor •() → self::WithT3
+    : super self::_WithT3&Object&F::•()
+    ;
+}
+abstract class _WithT4&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT4&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT4 extends self::_WithT4&Object&F {
+  synthetic constructor •() → self::WithT4
+    : super self::_WithT4&Object&F::•()
+    ;
+}
+abstract class _WithT5&Object&F = core::Object with self::Class<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT5&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT5 extends self::_WithT5&Object&F {
+  synthetic constructor •() → self::WithT5
+    : super self::_WithT5&Object&F::•()
+    ;
+}
+abstract class _WithT6&Object&F = core::Object with self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT6&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT6 extends self::_WithT6&Object&F {
+  synthetic constructor •() → self::WithT6
+    : super self::_WithT6&Object&F::•()
+    ;
+}
+abstract class _WithT7&Object&F = core::Object with self::Class<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT7&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT7 extends self::_WithT7&Object&F {
+  synthetic constructor •() → self::WithT7
+    : super self::_WithT7&Object&F::•()
+    ;
+}
+abstract class _WithT8&Object&F = core::Object with self::Class<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT8&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT8 extends self::_WithT8&Object&F {
+  synthetic constructor •() → self::WithT8
+    : super self::_WithT8&Object&F::•()
+    ;
+}
+abstract class _WithS1&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS1&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS1 extends self::_WithS1&Object&G {
+  synthetic constructor •() → self::WithS1
+    : super self::_WithS1&Object&G::•()
+    ;
+}
+abstract class _WithS2&Object&G = core::Object with self::G<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS2&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS2 extends self::_WithS2&Object&G {
+  synthetic constructor •() → self::WithS2
+    : super self::_WithS2&Object&G::•()
+    ;
+}
+abstract class _WithS3&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS3&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS3 extends self::_WithS3&Object&G {
+  synthetic constructor •() → self::WithS3
+    : super self::_WithS3&Object&G::•()
+    ;
+}
+abstract class _WithS4&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS4&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS4 extends self::_WithS4&Object&G {
+  synthetic constructor •() → self::WithS4
+    : super self::_WithS4&Object&G::•()
+    ;
+}
+abstract class _WithS5&Object&G = core::Object with self::G<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS5&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS5 extends self::_WithS5&Object&G {
+  synthetic constructor •() → self::WithS5
+    : super self::_WithS5&Object&G::•()
+    ;
+}
+abstract class _WithS6&Object&G = core::Object with self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS6&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS6 extends self::_WithS6&Object&G {
+  synthetic constructor •() → self::WithS6
+    : super self::_WithS6&Object&G::•()
+    ;
+}
+abstract class _WithS7&Object&G = core::Object with self::G<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS7&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS7 extends self::_WithS7&Object&G {
+  synthetic constructor •() → self::WithS7
+    : super self::_WithS7&Object&G::•()
+    ;
+}
+abstract class _WithS8&Object&G = core::Object with self::G<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS8&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS8 extends self::_WithS8&Object&G {
+  synthetic constructor •() → self::WithS8
+    : super self::_WithS8&Object&G::•()
+    ;
+}
+class EnumImplementsT1 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT1> values = #C4;
+  static const field self::EnumImplementsT1 a = #C3;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT2 extends core::_Enum implements self::Class<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT2> values = #C6;
+  static const field self::EnumImplementsT2 a = #C5;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT3 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT3> values = #C8;
+  static const field self::EnumImplementsT3 a = #C7;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT4 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT4> values = #C10;
+  static const field self::EnumImplementsT4 a = #C9;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT5 extends core::_Enum implements self::Class<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT5> values = #C12;
+  static const field self::EnumImplementsT5 a = #C11;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT6 extends core::_Enum implements self::Class<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT6> values = #C14;
+  static const field self::EnumImplementsT6 a = #C13;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT7 extends core::_Enum implements self::Class<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT7> values = #C16;
+  static const field self::EnumImplementsT7 a = #C15;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT8 extends core::_Enum implements self::Class<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT8> values = #C18;
+  static const field self::EnumImplementsT8 a = #C17;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT8.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS1 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS1> values = #C20;
+  static const field self::EnumImplementsS1 a = #C19;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS2 extends core::_Enum implements self::G<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS2> values = #C22;
+  static const field self::EnumImplementsS2 a = #C21;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS3 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS3> values = #C24;
+  static const field self::EnumImplementsS3 a = #C23;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS4 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS4> values = #C26;
+  static const field self::EnumImplementsS4 a = #C25;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS5 extends core::_Enum implements self::G<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS5> values = #C28;
+  static const field self::EnumImplementsS5 a = #C27;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS6 extends core::_Enum implements self::G<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS6> values = #C30;
+  static const field self::EnumImplementsS6 a = #C29;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS7 extends core::_Enum implements self::G<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS7> values = #C32;
+  static const field self::EnumImplementsS7 a = #C31;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS8 extends core::_Enum implements self::G<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS8> values = #C34;
+  static const field self::EnumImplementsS8 a = #C33;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT1&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT1&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT1 extends self::_EnumWithT1&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT1> values = #C36;
+  static const field self::EnumWithT1 a = #C35;
+  const constructor •(core::int index, core::String name) → self::EnumWithT1
+    : super self::_EnumWithT1&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT2&_Enum&F = core::_Enum with self::Class<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT2&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT2 extends self::_EnumWithT2&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT2> values = #C38;
+  static const field self::EnumWithT2 a = #C37;
+  const constructor •(core::int index, core::String name) → self::EnumWithT2
+    : super self::_EnumWithT2&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT3&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT3&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT3 extends self::_EnumWithT3&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT3> values = #C40;
+  static const field self::EnumWithT3 a = #C39;
+  const constructor •(core::int index, core::String name) → self::EnumWithT3
+    : super self::_EnumWithT3&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT4&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT4&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT4 extends self::_EnumWithT4&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT4> values = #C42;
+  static const field self::EnumWithT4 a = #C41;
+  const constructor •(core::int index, core::String name) → self::EnumWithT4
+    : super self::_EnumWithT4&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT5&_Enum&F = core::_Enum with self::Class<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT5&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT5 extends self::_EnumWithT5&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT5> values = #C44;
+  static const field self::EnumWithT5 a = #C43;
+  const constructor •(core::int index, core::String name) → self::EnumWithT5
+    : super self::_EnumWithT5&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT6&_Enum&F = core::_Enum with self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT6&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT6 extends self::_EnumWithT6&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT6> values = #C46;
+  static const field self::EnumWithT6 a = #C45;
+  const constructor •(core::int index, core::String name) → self::EnumWithT6
+    : super self::_EnumWithT6&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT7&_Enum&F = core::_Enum with self::Class<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT7&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT7 extends self::_EnumWithT7&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT7> values = #C48;
+  static const field self::EnumWithT7 a = #C47;
+  const constructor •(core::int index, core::String name) → self::EnumWithT7
+    : super self::_EnumWithT7&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT8&_Enum&F = core::_Enum with self::Class<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT8&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT8 extends self::_EnumWithT8&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT8> values = #C50;
+  static const field self::EnumWithT8 a = #C49;
+  const constructor •(core::int index, core::String name) → self::EnumWithT8
+    : super self::_EnumWithT8&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS1&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS1&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS1 extends self::_EnumWithS1&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS1> values = #C52;
+  static const field self::EnumWithS1 a = #C51;
+  const constructor •(core::int index, core::String name) → self::EnumWithS1
+    : super self::_EnumWithS1&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS2&_Enum&G = core::_Enum with self::G<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS2&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS2 extends self::_EnumWithS2&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS2> values = #C54;
+  static const field self::EnumWithS2 a = #C53;
+  const constructor •(core::int index, core::String name) → self::EnumWithS2
+    : super self::_EnumWithS2&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS3&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS3&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS3 extends self::_EnumWithS3&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS3> values = #C56;
+  static const field self::EnumWithS3 a = #C55;
+  const constructor •(core::int index, core::String name) → self::EnumWithS3
+    : super self::_EnumWithS3&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS4&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS4&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS4 extends self::_EnumWithS4&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS4> values = #C58;
+  static const field self::EnumWithS4 a = #C57;
+  const constructor •(core::int index, core::String name) → self::EnumWithS4
+    : super self::_EnumWithS4&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS5&_Enum&G = core::_Enum with self::G<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS5&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS5 extends self::_EnumWithS5&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS5> values = #C60;
+  static const field self::EnumWithS5 a = #C59;
+  const constructor •(core::int index, core::String name) → self::EnumWithS5
+    : super self::_EnumWithS5&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS6&_Enum&G = core::_Enum with self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS6&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS6 extends self::_EnumWithS6&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS6> values = #C62;
+  static const field self::EnumWithS6 a = #C61;
+  const constructor •(core::int index, core::String name) → self::EnumWithS6
+    : super self::_EnumWithS6&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS7&_Enum&G = core::_Enum with self::G<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS7&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS7 extends self::_EnumWithS7&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS7> values = #C64;
+  static const field self::EnumWithS7 a = #C63;
+  const constructor •(core::int index, core::String name) → self::EnumWithS7
+    : super self::_EnumWithS7&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS8&_Enum&G = core::_Enum with self::G<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS8&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS8 extends self::_EnumWithS8&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS8> values = #C66;
+  static const field self::EnumWithS8 a = #C65;
+  const constructor •(core::int index, core::String name) → self::EnumWithS8
+    : super self::_EnumWithS8&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnT1 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT2 extends self::Class<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT3 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT4 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT5 extends self::Class<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT6 extends self::Class<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT7 extends self::Class<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT8 extends self::Class<core::int> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS1 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS2 extends self::G<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS3 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS4 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS5 extends self::G<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS6 extends self::G<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS7 extends self::G<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS8 extends self::G<core::int> /*isMixinDeclaration*/  {
+}
+extension ExtensionOnT1 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT2 on self::Class<dynamic> {
+}
+extension ExtensionOnT3 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT4 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT5 on self::Class<self::ConcreteClass> {
+}
+extension ExtensionOnT6 on self::Class<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnT7 on self::Class<core::Object> {
+}
+extension ExtensionOnT8 on self::Class<core::int> {
+}
+extension ExtensionOnS1 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS2 on self::G<dynamic> {
+}
+extension ExtensionOnS3 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS4 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS5 on self::G<self::ConcreteClass> {
+}
+extension ExtensionOnS6 on self::G<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnS7 on self::G<core::Object> {
+}
+extension ExtensionOnS8 on self::G<core::int> {
+}
+static method main() → dynamic {}
+static method _#F#new#tearOff<X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class<self::_#F#new#tearOff::X>
+  return new self::Class::•<self::_#F#new#tearOff::X>();
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::EnumImplementsT1 {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsT1*>[#C3]
+  #C5 = self::EnumImplementsT2 {index:#C1, _name:#C2}
+  #C6 = <self::EnumImplementsT2*>[#C5]
+  #C7 = self::EnumImplementsT3 {index:#C1, _name:#C2}
+  #C8 = <self::EnumImplementsT3*>[#C7]
+  #C9 = self::EnumImplementsT4 {index:#C1, _name:#C2}
+  #C10 = <self::EnumImplementsT4*>[#C9]
+  #C11 = self::EnumImplementsT5 {index:#C1, _name:#C2}
+  #C12 = <self::EnumImplementsT5*>[#C11]
+  #C13 = self::EnumImplementsT6 {index:#C1, _name:#C2}
+  #C14 = <self::EnumImplementsT6*>[#C13]
+  #C15 = self::EnumImplementsT7 {index:#C1, _name:#C2}
+  #C16 = <self::EnumImplementsT7*>[#C15]
+  #C17 = self::EnumImplementsT8 {index:#C1, _name:#C2}
+  #C18 = <self::EnumImplementsT8*>[#C17]
+  #C19 = self::EnumImplementsS1 {index:#C1, _name:#C2}
+  #C20 = <self::EnumImplementsS1*>[#C19]
+  #C21 = self::EnumImplementsS2 {index:#C1, _name:#C2}
+  #C22 = <self::EnumImplementsS2*>[#C21]
+  #C23 = self::EnumImplementsS3 {index:#C1, _name:#C2}
+  #C24 = <self::EnumImplementsS3*>[#C23]
+  #C25 = self::EnumImplementsS4 {index:#C1, _name:#C2}
+  #C26 = <self::EnumImplementsS4*>[#C25]
+  #C27 = self::EnumImplementsS5 {index:#C1, _name:#C2}
+  #C28 = <self::EnumImplementsS5*>[#C27]
+  #C29 = self::EnumImplementsS6 {index:#C1, _name:#C2}
+  #C30 = <self::EnumImplementsS6*>[#C29]
+  #C31 = self::EnumImplementsS7 {index:#C1, _name:#C2}
+  #C32 = <self::EnumImplementsS7*>[#C31]
+  #C33 = self::EnumImplementsS8 {index:#C1, _name:#C2}
+  #C34 = <self::EnumImplementsS8*>[#C33]
+  #C35 = self::EnumWithT1 {index:#C1, _name:#C2}
+  #C36 = <self::EnumWithT1*>[#C35]
+  #C37 = self::EnumWithT2 {index:#C1, _name:#C2}
+  #C38 = <self::EnumWithT2*>[#C37]
+  #C39 = self::EnumWithT3 {index:#C1, _name:#C2}
+  #C40 = <self::EnumWithT3*>[#C39]
+  #C41 = self::EnumWithT4 {index:#C1, _name:#C2}
+  #C42 = <self::EnumWithT4*>[#C41]
+  #C43 = self::EnumWithT5 {index:#C1, _name:#C2}
+  #C44 = <self::EnumWithT5*>[#C43]
+  #C45 = self::EnumWithT6 {index:#C1, _name:#C2}
+  #C46 = <self::EnumWithT6*>[#C45]
+  #C47 = self::EnumWithT7 {index:#C1, _name:#C2}
+  #C48 = <self::EnumWithT7*>[#C47]
+  #C49 = self::EnumWithT8 {index:#C1, _name:#C2}
+  #C50 = <self::EnumWithT8*>[#C49]
+  #C51 = self::EnumWithS1 {index:#C1, _name:#C2}
+  #C52 = <self::EnumWithS1*>[#C51]
+  #C53 = self::EnumWithS2 {index:#C1, _name:#C2}
+  #C54 = <self::EnumWithS2*>[#C53]
+  #C55 = self::EnumWithS3 {index:#C1, _name:#C2}
+  #C56 = <self::EnumWithS3*>[#C55]
+  #C57 = self::EnumWithS4 {index:#C1, _name:#C2}
+  #C58 = <self::EnumWithS4*>[#C57]
+  #C59 = self::EnumWithS5 {index:#C1, _name:#C2}
+  #C60 = <self::EnumWithS5*>[#C59]
+  #C61 = self::EnumWithS6 {index:#C1, _name:#C2}
+  #C62 = <self::EnumWithS6*>[#C61]
+  #C63 = self::EnumWithS7 {index:#C1, _name:#C2}
+  #C64 = <self::EnumWithS7*>[#C63]
+  #C65 = self::EnumWithS8 {index:#C1, _name:#C2}
+  #C66 = <self::EnumWithS8*>[#C65]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_supertypes.dart:
+- EnumImplementsT1. (from org-dartlang-testcase:///bounds_supertypes.dart:109:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- EnumImplementsT2. (from org-dartlang-testcase:///bounds_supertypes.dart:111:6)
+- EnumImplementsT3. (from org-dartlang-testcase:///bounds_supertypes.dart:113:6)
+- EnumImplementsT4. (from org-dartlang-testcase:///bounds_supertypes.dart:115:6)
+- EnumImplementsT5. (from org-dartlang-testcase:///bounds_supertypes.dart:117:6)
+- EnumImplementsT6. (from org-dartlang-testcase:///bounds_supertypes.dart:119:6)
+- EnumImplementsT7. (from org-dartlang-testcase:///bounds_supertypes.dart:121:6)
+- EnumImplementsT8. (from org-dartlang-testcase:///bounds_supertypes.dart:123:6)
+- EnumImplementsS1. (from org-dartlang-testcase:///bounds_supertypes.dart:125:6)
+- EnumImplementsS2. (from org-dartlang-testcase:///bounds_supertypes.dart:127:6)
+- EnumImplementsS3. (from org-dartlang-testcase:///bounds_supertypes.dart:129:6)
+- EnumImplementsS4. (from org-dartlang-testcase:///bounds_supertypes.dart:131:6)
+- EnumImplementsS5. (from org-dartlang-testcase:///bounds_supertypes.dart:133:6)
+- EnumImplementsS6. (from org-dartlang-testcase:///bounds_supertypes.dart:135:6)
+- EnumImplementsS7. (from org-dartlang-testcase:///bounds_supertypes.dart:137:6)
+- EnumImplementsS8. (from org-dartlang-testcase:///bounds_supertypes.dart:139:6)
+- EnumWithT1. (from org-dartlang-testcase:///bounds_supertypes.dart:141:6)
+- _EnumWithT1&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:141:6)
+- EnumWithT2. (from org-dartlang-testcase:///bounds_supertypes.dart:143:6)
+- _EnumWithT2&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:143:6)
+- EnumWithT3. (from org-dartlang-testcase:///bounds_supertypes.dart:145:6)
+- _EnumWithT3&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:145:6)
+- EnumWithT4. (from org-dartlang-testcase:///bounds_supertypes.dart:147:6)
+- _EnumWithT4&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:147:6)
+- EnumWithT5. (from org-dartlang-testcase:///bounds_supertypes.dart:149:6)
+- _EnumWithT5&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:149:6)
+- EnumWithT6. (from org-dartlang-testcase:///bounds_supertypes.dart:151:6)
+- _EnumWithT6&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:151:6)
+- EnumWithT7. (from org-dartlang-testcase:///bounds_supertypes.dart:153:6)
+- _EnumWithT7&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:153:6)
+- EnumWithT8. (from org-dartlang-testcase:///bounds_supertypes.dart:155:6)
+- _EnumWithT8&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:155:6)
+- EnumWithS1. (from org-dartlang-testcase:///bounds_supertypes.dart:157:6)
+- _EnumWithS1&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:157:6)
+- EnumWithS2. (from org-dartlang-testcase:///bounds_supertypes.dart:159:6)
+- _EnumWithS2&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:159:6)
+- EnumWithS3. (from org-dartlang-testcase:///bounds_supertypes.dart:161:6)
+- _EnumWithS3&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:161:6)
+- EnumWithS4. (from org-dartlang-testcase:///bounds_supertypes.dart:163:6)
+- _EnumWithS4&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:163:6)
+- EnumWithS5. (from org-dartlang-testcase:///bounds_supertypes.dart:165:6)
+- _EnumWithS5&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:165:6)
+- EnumWithS6. (from org-dartlang-testcase:///bounds_supertypes.dart:167:6)
+- _EnumWithS6&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:167:6)
+- EnumWithS7. (from org-dartlang-testcase:///bounds_supertypes.dart:169:6)
+- _EnumWithS7&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:169:6)
+- EnumWithS8. (from org-dartlang-testcase:///bounds_supertypes.dart:171:6)
+- _EnumWithS8&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:171:6)
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.modular.expect
new file mode 100644
index 0000000..4b8667d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.modular.expect
@@ -0,0 +1,1599 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:13:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsT1 extends F {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:15:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT2 extends F<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:17:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT3 extends F<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:19:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT4 extends F<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:25:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT7 extends F<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:27:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT8 extends F<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:29:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsS1 extends G {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:31:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS2 extends G<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:33:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS3 extends G<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:35:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS4 extends G<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:41:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS7 extends G<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:43:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS8 extends G<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:45:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsT1 implements F {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:47:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT2 implements F<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:49:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT3 implements F<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:51:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT4 implements F<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:57:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT7 implements F<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:59:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT8 implements F<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:61:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsS1 implements G {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:63:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS2 implements G<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:65:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS3 implements G<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:67:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS4 implements G<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:73:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS7 implements G<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:75:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS8 implements G<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:77:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithT1 with F {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:79:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT2 with F<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:81:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT3 with F<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:83:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT4 with F<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:89: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT7 with F<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:91: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT8 with F<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:109:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsT1 implements F /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:111:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT2 implements F<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:113:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT3 implements F<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:115:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT4 implements F<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:121:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT7 implements F<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:123:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT8 implements F<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:125:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsS1 implements G /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:127:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS2 implements G<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:129:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS3 implements G<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:131:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS4 implements G<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:137:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS7 implements G<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:139:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS8 implements G<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:141:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithT1 with F /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:143:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT2 with F<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:145:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT3 with F<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:147:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT4 with F<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:153:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT7 with F<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:155:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT8 with F<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:173:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnT1 on F {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:175:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT2 on F<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:177:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT3 on F<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:179:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT4 on F<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:185: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT7 on F<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:187: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT8 on F<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:189:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnS1 on G {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:191:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS2 on G<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:193:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS3 on G<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:195:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS4 on G<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:201: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS7 on G<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:203: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS8 on G<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:217:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT7 on F<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:219:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT8 on F<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:233:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS7 on G<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:235:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS8 on G<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:93:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithS1 with G {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:95:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS2 with G<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:97:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS3 with G<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:99:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS4 with G<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:105:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS7 with G<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:107:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS8 with G<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:157:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithS1 with G /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:159:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS2 with G<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:161:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS3 with G<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:163:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS4 with G<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:169: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS7 with G<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:171: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS8 with G<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = self::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class ExtendsT1 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT1
+    : super self::Class::•()
+    ;
+}
+class ExtendsT2 extends self::Class<dynamic> {
+  synthetic constructor •() → self::ExtendsT2
+    : super self::Class::•()
+    ;
+}
+class ExtendsT3 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT3
+    : super self::Class::•()
+    ;
+}
+class ExtendsT4 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT4
+    : super self::Class::•()
+    ;
+}
+class ExtendsT5 extends self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsT5
+    : super self::Class::•()
+    ;
+}
+class ExtendsT6 extends self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsT6
+    : super self::Class::•()
+    ;
+}
+class ExtendsT7 extends self::Class<core::Object> {
+  synthetic constructor •() → self::ExtendsT7
+    : super self::Class::•()
+    ;
+}
+class ExtendsT8 extends self::Class<core::int> {
+  synthetic constructor •() → self::ExtendsT8
+    : super self::Class::•()
+    ;
+}
+class ExtendsS1 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS1
+    : super self::G::•()
+    ;
+}
+class ExtendsS2 extends self::G<dynamic> {
+  synthetic constructor •() → self::ExtendsS2
+    : super self::G::•()
+    ;
+}
+class ExtendsS3 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS3
+    : super self::G::•()
+    ;
+}
+class ExtendsS4 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS4
+    : super self::G::•()
+    ;
+}
+class ExtendsS5 extends self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsS5
+    : super self::G::•()
+    ;
+}
+class ExtendsS6 extends self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsS6
+    : super self::G::•()
+    ;
+}
+class ExtendsS7 extends self::G<core::Object> {
+  synthetic constructor •() → self::ExtendsS7
+    : super self::G::•()
+    ;
+}
+class ExtendsS8 extends self::G<core::int> {
+  synthetic constructor •() → self::ExtendsS8
+    : super self::G::•()
+    ;
+}
+class ImplementsT1 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT1
+    : super core::Object::•()
+    ;
+}
+class ImplementsT2 extends core::Object implements self::Class<dynamic> {
+  synthetic constructor •() → self::ImplementsT2
+    : super core::Object::•()
+    ;
+}
+class ImplementsT3 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT3
+    : super core::Object::•()
+    ;
+}
+class ImplementsT4 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT4
+    : super core::Object::•()
+    ;
+}
+class ImplementsT5 extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsT5
+    : super core::Object::•()
+    ;
+}
+class ImplementsT6 extends core::Object implements self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsT6
+    : super core::Object::•()
+    ;
+}
+class ImplementsT7 extends core::Object implements self::Class<core::Object> {
+  synthetic constructor •() → self::ImplementsT7
+    : super core::Object::•()
+    ;
+}
+class ImplementsT8 extends core::Object implements self::Class<core::int> {
+  synthetic constructor •() → self::ImplementsT8
+    : super core::Object::•()
+    ;
+}
+class ImplementsS1 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS1
+    : super core::Object::•()
+    ;
+}
+class ImplementsS2 extends core::Object implements self::G<dynamic> {
+  synthetic constructor •() → self::ImplementsS2
+    : super core::Object::•()
+    ;
+}
+class ImplementsS3 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS3
+    : super core::Object::•()
+    ;
+}
+class ImplementsS4 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS4
+    : super core::Object::•()
+    ;
+}
+class ImplementsS5 extends core::Object implements self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsS5
+    : super core::Object::•()
+    ;
+}
+class ImplementsS6 extends core::Object implements self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsS6
+    : super core::Object::•()
+    ;
+}
+class ImplementsS7 extends core::Object implements self::G<core::Object> {
+  synthetic constructor •() → self::ImplementsS7
+    : super core::Object::•()
+    ;
+}
+class ImplementsS8 extends core::Object implements self::G<core::int> {
+  synthetic constructor •() → self::ImplementsS8
+    : super core::Object::•()
+    ;
+}
+abstract class _WithT1&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT1&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT1 extends self::_WithT1&Object&F {
+  synthetic constructor •() → self::WithT1
+    : super self::_WithT1&Object&F::•()
+    ;
+}
+abstract class _WithT2&Object&F = core::Object with self::Class<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT2&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT2 extends self::_WithT2&Object&F {
+  synthetic constructor •() → self::WithT2
+    : super self::_WithT2&Object&F::•()
+    ;
+}
+abstract class _WithT3&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT3&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT3 extends self::_WithT3&Object&F {
+  synthetic constructor •() → self::WithT3
+    : super self::_WithT3&Object&F::•()
+    ;
+}
+abstract class _WithT4&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT4&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT4 extends self::_WithT4&Object&F {
+  synthetic constructor •() → self::WithT4
+    : super self::_WithT4&Object&F::•()
+    ;
+}
+abstract class _WithT5&Object&F = core::Object with self::Class<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT5&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT5 extends self::_WithT5&Object&F {
+  synthetic constructor •() → self::WithT5
+    : super self::_WithT5&Object&F::•()
+    ;
+}
+abstract class _WithT6&Object&F = core::Object with self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT6&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT6 extends self::_WithT6&Object&F {
+  synthetic constructor •() → self::WithT6
+    : super self::_WithT6&Object&F::•()
+    ;
+}
+abstract class _WithT7&Object&F = core::Object with self::Class<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT7&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT7 extends self::_WithT7&Object&F {
+  synthetic constructor •() → self::WithT7
+    : super self::_WithT7&Object&F::•()
+    ;
+}
+abstract class _WithT8&Object&F = core::Object with self::Class<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT8&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT8 extends self::_WithT8&Object&F {
+  synthetic constructor •() → self::WithT8
+    : super self::_WithT8&Object&F::•()
+    ;
+}
+abstract class _WithS1&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS1&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS1 extends self::_WithS1&Object&G {
+  synthetic constructor •() → self::WithS1
+    : super self::_WithS1&Object&G::•()
+    ;
+}
+abstract class _WithS2&Object&G = core::Object with self::G<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS2&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS2 extends self::_WithS2&Object&G {
+  synthetic constructor •() → self::WithS2
+    : super self::_WithS2&Object&G::•()
+    ;
+}
+abstract class _WithS3&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS3&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS3 extends self::_WithS3&Object&G {
+  synthetic constructor •() → self::WithS3
+    : super self::_WithS3&Object&G::•()
+    ;
+}
+abstract class _WithS4&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS4&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS4 extends self::_WithS4&Object&G {
+  synthetic constructor •() → self::WithS4
+    : super self::_WithS4&Object&G::•()
+    ;
+}
+abstract class _WithS5&Object&G = core::Object with self::G<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS5&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS5 extends self::_WithS5&Object&G {
+  synthetic constructor •() → self::WithS5
+    : super self::_WithS5&Object&G::•()
+    ;
+}
+abstract class _WithS6&Object&G = core::Object with self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS6&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS6 extends self::_WithS6&Object&G {
+  synthetic constructor •() → self::WithS6
+    : super self::_WithS6&Object&G::•()
+    ;
+}
+abstract class _WithS7&Object&G = core::Object with self::G<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS7&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS7 extends self::_WithS7&Object&G {
+  synthetic constructor •() → self::WithS7
+    : super self::_WithS7&Object&G::•()
+    ;
+}
+abstract class _WithS8&Object&G = core::Object with self::G<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS8&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS8 extends self::_WithS8&Object&G {
+  synthetic constructor •() → self::WithS8
+    : super self::_WithS8&Object&G::•()
+    ;
+}
+class EnumImplementsT1 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT1> values = #C4;
+  static const field self::EnumImplementsT1 a = #C3;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT2 extends core::_Enum implements self::Class<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT2> values = #C6;
+  static const field self::EnumImplementsT2 a = #C5;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT3 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT3> values = #C8;
+  static const field self::EnumImplementsT3 a = #C7;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT4 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT4> values = #C10;
+  static const field self::EnumImplementsT4 a = #C9;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT5 extends core::_Enum implements self::Class<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT5> values = #C12;
+  static const field self::EnumImplementsT5 a = #C11;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT6 extends core::_Enum implements self::Class<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT6> values = #C14;
+  static const field self::EnumImplementsT6 a = #C13;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT7 extends core::_Enum implements self::Class<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT7> values = #C16;
+  static const field self::EnumImplementsT7 a = #C15;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT8 extends core::_Enum implements self::Class<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT8> values = #C18;
+  static const field self::EnumImplementsT8 a = #C17;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT8.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS1 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS1> values = #C20;
+  static const field self::EnumImplementsS1 a = #C19;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS2 extends core::_Enum implements self::G<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS2> values = #C22;
+  static const field self::EnumImplementsS2 a = #C21;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS3 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS3> values = #C24;
+  static const field self::EnumImplementsS3 a = #C23;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS4 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS4> values = #C26;
+  static const field self::EnumImplementsS4 a = #C25;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS5 extends core::_Enum implements self::G<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS5> values = #C28;
+  static const field self::EnumImplementsS5 a = #C27;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS6 extends core::_Enum implements self::G<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS6> values = #C30;
+  static const field self::EnumImplementsS6 a = #C29;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS7 extends core::_Enum implements self::G<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS7> values = #C32;
+  static const field self::EnumImplementsS7 a = #C31;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS8 extends core::_Enum implements self::G<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS8> values = #C34;
+  static const field self::EnumImplementsS8 a = #C33;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT1&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT1&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT1 extends self::_EnumWithT1&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT1> values = #C36;
+  static const field self::EnumWithT1 a = #C35;
+  const constructor •(core::int index, core::String name) → self::EnumWithT1
+    : super self::_EnumWithT1&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT2&_Enum&F = core::_Enum with self::Class<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT2&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT2 extends self::_EnumWithT2&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT2> values = #C38;
+  static const field self::EnumWithT2 a = #C37;
+  const constructor •(core::int index, core::String name) → self::EnumWithT2
+    : super self::_EnumWithT2&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT3&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT3&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT3 extends self::_EnumWithT3&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT3> values = #C40;
+  static const field self::EnumWithT3 a = #C39;
+  const constructor •(core::int index, core::String name) → self::EnumWithT3
+    : super self::_EnumWithT3&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT4&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT4&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT4 extends self::_EnumWithT4&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT4> values = #C42;
+  static const field self::EnumWithT4 a = #C41;
+  const constructor •(core::int index, core::String name) → self::EnumWithT4
+    : super self::_EnumWithT4&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT5&_Enum&F = core::_Enum with self::Class<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT5&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT5 extends self::_EnumWithT5&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT5> values = #C44;
+  static const field self::EnumWithT5 a = #C43;
+  const constructor •(core::int index, core::String name) → self::EnumWithT5
+    : super self::_EnumWithT5&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT6&_Enum&F = core::_Enum with self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT6&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT6 extends self::_EnumWithT6&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT6> values = #C46;
+  static const field self::EnumWithT6 a = #C45;
+  const constructor •(core::int index, core::String name) → self::EnumWithT6
+    : super self::_EnumWithT6&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT7&_Enum&F = core::_Enum with self::Class<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT7&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT7 extends self::_EnumWithT7&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT7> values = #C48;
+  static const field self::EnumWithT7 a = #C47;
+  const constructor •(core::int index, core::String name) → self::EnumWithT7
+    : super self::_EnumWithT7&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT8&_Enum&F = core::_Enum with self::Class<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT8&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT8 extends self::_EnumWithT8&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT8> values = #C50;
+  static const field self::EnumWithT8 a = #C49;
+  const constructor •(core::int index, core::String name) → self::EnumWithT8
+    : super self::_EnumWithT8&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS1&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS1&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS1 extends self::_EnumWithS1&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS1> values = #C52;
+  static const field self::EnumWithS1 a = #C51;
+  const constructor •(core::int index, core::String name) → self::EnumWithS1
+    : super self::_EnumWithS1&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS2&_Enum&G = core::_Enum with self::G<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS2&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS2 extends self::_EnumWithS2&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS2> values = #C54;
+  static const field self::EnumWithS2 a = #C53;
+  const constructor •(core::int index, core::String name) → self::EnumWithS2
+    : super self::_EnumWithS2&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS3&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS3&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS3 extends self::_EnumWithS3&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS3> values = #C56;
+  static const field self::EnumWithS3 a = #C55;
+  const constructor •(core::int index, core::String name) → self::EnumWithS3
+    : super self::_EnumWithS3&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS4&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS4&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS4 extends self::_EnumWithS4&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS4> values = #C58;
+  static const field self::EnumWithS4 a = #C57;
+  const constructor •(core::int index, core::String name) → self::EnumWithS4
+    : super self::_EnumWithS4&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS5&_Enum&G = core::_Enum with self::G<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS5&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS5 extends self::_EnumWithS5&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS5> values = #C60;
+  static const field self::EnumWithS5 a = #C59;
+  const constructor •(core::int index, core::String name) → self::EnumWithS5
+    : super self::_EnumWithS5&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS6&_Enum&G = core::_Enum with self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS6&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS6 extends self::_EnumWithS6&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS6> values = #C62;
+  static const field self::EnumWithS6 a = #C61;
+  const constructor •(core::int index, core::String name) → self::EnumWithS6
+    : super self::_EnumWithS6&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS7&_Enum&G = core::_Enum with self::G<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS7&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS7 extends self::_EnumWithS7&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS7> values = #C64;
+  static const field self::EnumWithS7 a = #C63;
+  const constructor •(core::int index, core::String name) → self::EnumWithS7
+    : super self::_EnumWithS7&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS8&_Enum&G = core::_Enum with self::G<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS8&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS8 extends self::_EnumWithS8&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS8> values = #C66;
+  static const field self::EnumWithS8 a = #C65;
+  const constructor •(core::int index, core::String name) → self::EnumWithS8
+    : super self::_EnumWithS8&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnT1 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT2 extends self::Class<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT3 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT4 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT5 extends self::Class<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT6 extends self::Class<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT7 extends self::Class<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT8 extends self::Class<core::int> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS1 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS2 extends self::G<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS3 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS4 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS5 extends self::G<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS6 extends self::G<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS7 extends self::G<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS8 extends self::G<core::int> /*isMixinDeclaration*/  {
+}
+extension ExtensionOnT1 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT2 on self::Class<dynamic> {
+}
+extension ExtensionOnT3 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT4 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT5 on self::Class<self::ConcreteClass> {
+}
+extension ExtensionOnT6 on self::Class<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnT7 on self::Class<core::Object> {
+}
+extension ExtensionOnT8 on self::Class<core::int> {
+}
+extension ExtensionOnS1 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS2 on self::G<dynamic> {
+}
+extension ExtensionOnS3 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS4 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS5 on self::G<self::ConcreteClass> {
+}
+extension ExtensionOnS6 on self::G<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnS7 on self::G<core::Object> {
+}
+extension ExtensionOnS8 on self::G<core::int> {
+}
+static method main() → dynamic {}
+static method _#F#new#tearOff<X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class<self::_#F#new#tearOff::X>
+  return new self::Class::•<self::_#F#new#tearOff::X>();
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::EnumImplementsT1 {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsT1*>[#C3]
+  #C5 = self::EnumImplementsT2 {index:#C1, _name:#C2}
+  #C6 = <self::EnumImplementsT2*>[#C5]
+  #C7 = self::EnumImplementsT3 {index:#C1, _name:#C2}
+  #C8 = <self::EnumImplementsT3*>[#C7]
+  #C9 = self::EnumImplementsT4 {index:#C1, _name:#C2}
+  #C10 = <self::EnumImplementsT4*>[#C9]
+  #C11 = self::EnumImplementsT5 {index:#C1, _name:#C2}
+  #C12 = <self::EnumImplementsT5*>[#C11]
+  #C13 = self::EnumImplementsT6 {index:#C1, _name:#C2}
+  #C14 = <self::EnumImplementsT6*>[#C13]
+  #C15 = self::EnumImplementsT7 {index:#C1, _name:#C2}
+  #C16 = <self::EnumImplementsT7*>[#C15]
+  #C17 = self::EnumImplementsT8 {index:#C1, _name:#C2}
+  #C18 = <self::EnumImplementsT8*>[#C17]
+  #C19 = self::EnumImplementsS1 {index:#C1, _name:#C2}
+  #C20 = <self::EnumImplementsS1*>[#C19]
+  #C21 = self::EnumImplementsS2 {index:#C1, _name:#C2}
+  #C22 = <self::EnumImplementsS2*>[#C21]
+  #C23 = self::EnumImplementsS3 {index:#C1, _name:#C2}
+  #C24 = <self::EnumImplementsS3*>[#C23]
+  #C25 = self::EnumImplementsS4 {index:#C1, _name:#C2}
+  #C26 = <self::EnumImplementsS4*>[#C25]
+  #C27 = self::EnumImplementsS5 {index:#C1, _name:#C2}
+  #C28 = <self::EnumImplementsS5*>[#C27]
+  #C29 = self::EnumImplementsS6 {index:#C1, _name:#C2}
+  #C30 = <self::EnumImplementsS6*>[#C29]
+  #C31 = self::EnumImplementsS7 {index:#C1, _name:#C2}
+  #C32 = <self::EnumImplementsS7*>[#C31]
+  #C33 = self::EnumImplementsS8 {index:#C1, _name:#C2}
+  #C34 = <self::EnumImplementsS8*>[#C33]
+  #C35 = self::EnumWithT1 {index:#C1, _name:#C2}
+  #C36 = <self::EnumWithT1*>[#C35]
+  #C37 = self::EnumWithT2 {index:#C1, _name:#C2}
+  #C38 = <self::EnumWithT2*>[#C37]
+  #C39 = self::EnumWithT3 {index:#C1, _name:#C2}
+  #C40 = <self::EnumWithT3*>[#C39]
+  #C41 = self::EnumWithT4 {index:#C1, _name:#C2}
+  #C42 = <self::EnumWithT4*>[#C41]
+  #C43 = self::EnumWithT5 {index:#C1, _name:#C2}
+  #C44 = <self::EnumWithT5*>[#C43]
+  #C45 = self::EnumWithT6 {index:#C1, _name:#C2}
+  #C46 = <self::EnumWithT6*>[#C45]
+  #C47 = self::EnumWithT7 {index:#C1, _name:#C2}
+  #C48 = <self::EnumWithT7*>[#C47]
+  #C49 = self::EnumWithT8 {index:#C1, _name:#C2}
+  #C50 = <self::EnumWithT8*>[#C49]
+  #C51 = self::EnumWithS1 {index:#C1, _name:#C2}
+  #C52 = <self::EnumWithS1*>[#C51]
+  #C53 = self::EnumWithS2 {index:#C1, _name:#C2}
+  #C54 = <self::EnumWithS2*>[#C53]
+  #C55 = self::EnumWithS3 {index:#C1, _name:#C2}
+  #C56 = <self::EnumWithS3*>[#C55]
+  #C57 = self::EnumWithS4 {index:#C1, _name:#C2}
+  #C58 = <self::EnumWithS4*>[#C57]
+  #C59 = self::EnumWithS5 {index:#C1, _name:#C2}
+  #C60 = <self::EnumWithS5*>[#C59]
+  #C61 = self::EnumWithS6 {index:#C1, _name:#C2}
+  #C62 = <self::EnumWithS6*>[#C61]
+  #C63 = self::EnumWithS7 {index:#C1, _name:#C2}
+  #C64 = <self::EnumWithS7*>[#C63]
+  #C65 = self::EnumWithS8 {index:#C1, _name:#C2}
+  #C66 = <self::EnumWithS8*>[#C65]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_supertypes.dart:
+- EnumImplementsT1. (from org-dartlang-testcase:///bounds_supertypes.dart:109:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- EnumImplementsT2. (from org-dartlang-testcase:///bounds_supertypes.dart:111:6)
+- EnumImplementsT3. (from org-dartlang-testcase:///bounds_supertypes.dart:113:6)
+- EnumImplementsT4. (from org-dartlang-testcase:///bounds_supertypes.dart:115:6)
+- EnumImplementsT5. (from org-dartlang-testcase:///bounds_supertypes.dart:117:6)
+- EnumImplementsT6. (from org-dartlang-testcase:///bounds_supertypes.dart:119:6)
+- EnumImplementsT7. (from org-dartlang-testcase:///bounds_supertypes.dart:121:6)
+- EnumImplementsT8. (from org-dartlang-testcase:///bounds_supertypes.dart:123:6)
+- EnumImplementsS1. (from org-dartlang-testcase:///bounds_supertypes.dart:125:6)
+- EnumImplementsS2. (from org-dartlang-testcase:///bounds_supertypes.dart:127:6)
+- EnumImplementsS3. (from org-dartlang-testcase:///bounds_supertypes.dart:129:6)
+- EnumImplementsS4. (from org-dartlang-testcase:///bounds_supertypes.dart:131:6)
+- EnumImplementsS5. (from org-dartlang-testcase:///bounds_supertypes.dart:133:6)
+- EnumImplementsS6. (from org-dartlang-testcase:///bounds_supertypes.dart:135:6)
+- EnumImplementsS7. (from org-dartlang-testcase:///bounds_supertypes.dart:137:6)
+- EnumImplementsS8. (from org-dartlang-testcase:///bounds_supertypes.dart:139:6)
+- EnumWithT1. (from org-dartlang-testcase:///bounds_supertypes.dart:141:6)
+- _EnumWithT1&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:141:6)
+- EnumWithT2. (from org-dartlang-testcase:///bounds_supertypes.dart:143:6)
+- _EnumWithT2&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:143:6)
+- EnumWithT3. (from org-dartlang-testcase:///bounds_supertypes.dart:145:6)
+- _EnumWithT3&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:145:6)
+- EnumWithT4. (from org-dartlang-testcase:///bounds_supertypes.dart:147:6)
+- _EnumWithT4&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:147:6)
+- EnumWithT5. (from org-dartlang-testcase:///bounds_supertypes.dart:149:6)
+- _EnumWithT5&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:149:6)
+- EnumWithT6. (from org-dartlang-testcase:///bounds_supertypes.dart:151:6)
+- _EnumWithT6&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:151:6)
+- EnumWithT7. (from org-dartlang-testcase:///bounds_supertypes.dart:153:6)
+- _EnumWithT7&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:153:6)
+- EnumWithT8. (from org-dartlang-testcase:///bounds_supertypes.dart:155:6)
+- _EnumWithT8&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:155:6)
+- EnumWithS1. (from org-dartlang-testcase:///bounds_supertypes.dart:157:6)
+- _EnumWithS1&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:157:6)
+- EnumWithS2. (from org-dartlang-testcase:///bounds_supertypes.dart:159:6)
+- _EnumWithS2&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:159:6)
+- EnumWithS3. (from org-dartlang-testcase:///bounds_supertypes.dart:161:6)
+- _EnumWithS3&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:161:6)
+- EnumWithS4. (from org-dartlang-testcase:///bounds_supertypes.dart:163:6)
+- _EnumWithS4&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:163:6)
+- EnumWithS5. (from org-dartlang-testcase:///bounds_supertypes.dart:165:6)
+- _EnumWithS5&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:165:6)
+- EnumWithS6. (from org-dartlang-testcase:///bounds_supertypes.dart:167:6)
+- _EnumWithS6&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:167:6)
+- EnumWithS7. (from org-dartlang-testcase:///bounds_supertypes.dart:169:6)
+- _EnumWithS7&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:169:6)
+- EnumWithS8. (from org-dartlang-testcase:///bounds_supertypes.dart:171:6)
+- _EnumWithS8&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:171:6)
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.outline.expect
new file mode 100644
index 0000000..ed00b2e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.outline.expect
@@ -0,0 +1,1478 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:13:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsT1 extends F {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:15:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT2 extends F<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:17:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT3 extends F<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:19:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT4 extends F<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:25:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT7 extends F<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:27:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT8 extends F<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:29:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsS1 extends G {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:31:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS2 extends G<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:33:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS3 extends G<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:35:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS4 extends G<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:41:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS7 extends G<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:43:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS8 extends G<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:45:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsT1 implements F {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:47:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT2 implements F<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:49:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT3 implements F<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:51:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT4 implements F<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:57:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT7 implements F<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:59:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT8 implements F<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:61:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsS1 implements G {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:63:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS2 implements G<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:65:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS3 implements G<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:67:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS4 implements G<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:73:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS7 implements G<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:75:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS8 implements G<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:77:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithT1 with F {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:79:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT2 with F<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:81:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT3 with F<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:83:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT4 with F<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:89: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT7 with F<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:91: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT8 with F<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:109:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsT1 implements F /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:111:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT2 implements F<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:113:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT3 implements F<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:115:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT4 implements F<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:121:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT7 implements F<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:123:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT8 implements F<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:125:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsS1 implements G /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:127:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS2 implements G<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:129:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS3 implements G<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:131:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS4 implements G<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:137:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS7 implements G<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:139:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS8 implements G<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:141:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithT1 with F /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:143:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT2 with F<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:145:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT3 with F<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:147:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT4 with F<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:153:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT7 with F<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:155:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT8 with F<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:173:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnT1 on F {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:175:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT2 on F<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:177:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT3 on F<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:179:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT4 on F<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:185: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT7 on F<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:187: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT8 on F<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:189:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnS1 on G {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:191:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS2 on G<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:193:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS3 on G<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:195:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS4 on G<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:201: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS7 on G<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:203: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS8 on G<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:217:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT7 on F<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:219:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT8 on F<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:233:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS7 on G<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:235:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS8 on G<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:93:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithS1 with G {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:95:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS2 with G<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:97:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS3 with G<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:99:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS4 with G<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:105:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS7 with G<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:107:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS8 with G<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:157:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithS1 with G /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:159:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS2 with G<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:161:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS3 with G<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:163:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS4 with G<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:169: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS7 with G<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:171: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS8 with G<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = self::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class ExtendsT1 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT1
+    ;
+}
+class ExtendsT2 extends self::Class<dynamic> {
+  synthetic constructor •() → self::ExtendsT2
+    ;
+}
+class ExtendsT3 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT3
+    ;
+}
+class ExtendsT4 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT4
+    ;
+}
+class ExtendsT5 extends self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsT5
+    ;
+}
+class ExtendsT6 extends self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsT6
+    ;
+}
+class ExtendsT7 extends self::Class<core::Object> {
+  synthetic constructor •() → self::ExtendsT7
+    ;
+}
+class ExtendsT8 extends self::Class<core::int> {
+  synthetic constructor •() → self::ExtendsT8
+    ;
+}
+class ExtendsS1 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS1
+    ;
+}
+class ExtendsS2 extends self::G<dynamic> {
+  synthetic constructor •() → self::ExtendsS2
+    ;
+}
+class ExtendsS3 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS3
+    ;
+}
+class ExtendsS4 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS4
+    ;
+}
+class ExtendsS5 extends self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsS5
+    ;
+}
+class ExtendsS6 extends self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsS6
+    ;
+}
+class ExtendsS7 extends self::G<core::Object> {
+  synthetic constructor •() → self::ExtendsS7
+    ;
+}
+class ExtendsS8 extends self::G<core::int> {
+  synthetic constructor •() → self::ExtendsS8
+    ;
+}
+class ImplementsT1 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT1
+    ;
+}
+class ImplementsT2 extends core::Object implements self::Class<dynamic> {
+  synthetic constructor •() → self::ImplementsT2
+    ;
+}
+class ImplementsT3 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT3
+    ;
+}
+class ImplementsT4 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT4
+    ;
+}
+class ImplementsT5 extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsT5
+    ;
+}
+class ImplementsT6 extends core::Object implements self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsT6
+    ;
+}
+class ImplementsT7 extends core::Object implements self::Class<core::Object> {
+  synthetic constructor •() → self::ImplementsT7
+    ;
+}
+class ImplementsT8 extends core::Object implements self::Class<core::int> {
+  synthetic constructor •() → self::ImplementsT8
+    ;
+}
+class ImplementsS1 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS1
+    ;
+}
+class ImplementsS2 extends core::Object implements self::G<dynamic> {
+  synthetic constructor •() → self::ImplementsS2
+    ;
+}
+class ImplementsS3 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS3
+    ;
+}
+class ImplementsS4 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS4
+    ;
+}
+class ImplementsS5 extends core::Object implements self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsS5
+    ;
+}
+class ImplementsS6 extends core::Object implements self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsS6
+    ;
+}
+class ImplementsS7 extends core::Object implements self::G<core::Object> {
+  synthetic constructor •() → self::ImplementsS7
+    ;
+}
+class ImplementsS8 extends core::Object implements self::G<core::int> {
+  synthetic constructor •() → self::ImplementsS8
+    ;
+}
+abstract class _WithT1&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT1&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT1 extends self::_WithT1&Object&F {
+  synthetic constructor •() → self::WithT1
+    ;
+}
+abstract class _WithT2&Object&F = core::Object with self::Class<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT2&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT2 extends self::_WithT2&Object&F {
+  synthetic constructor •() → self::WithT2
+    ;
+}
+abstract class _WithT3&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT3&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT3 extends self::_WithT3&Object&F {
+  synthetic constructor •() → self::WithT3
+    ;
+}
+abstract class _WithT4&Object&F = core::Object with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT4&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT4 extends self::_WithT4&Object&F {
+  synthetic constructor •() → self::WithT4
+    ;
+}
+abstract class _WithT5&Object&F = core::Object with self::Class<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT5&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT5 extends self::_WithT5&Object&F {
+  synthetic constructor •() → self::WithT5
+    ;
+}
+abstract class _WithT6&Object&F = core::Object with self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT6&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT6 extends self::_WithT6&Object&F {
+  synthetic constructor •() → self::WithT6
+    ;
+}
+abstract class _WithT7&Object&F = core::Object with self::Class<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT7&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT7 extends self::_WithT7&Object&F {
+  synthetic constructor •() → self::WithT7
+    ;
+}
+abstract class _WithT8&Object&F = core::Object with self::Class<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT8&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT8 extends self::_WithT8&Object&F {
+  synthetic constructor •() → self::WithT8
+    ;
+}
+abstract class _WithS1&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS1&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS1 extends self::_WithS1&Object&G {
+  synthetic constructor •() → self::WithS1
+    ;
+}
+abstract class _WithS2&Object&G = core::Object with self::G<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS2&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS2 extends self::_WithS2&Object&G {
+  synthetic constructor •() → self::WithS2
+    ;
+}
+abstract class _WithS3&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS3&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS3 extends self::_WithS3&Object&G {
+  synthetic constructor •() → self::WithS3
+    ;
+}
+abstract class _WithS4&Object&G = core::Object with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS4&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS4 extends self::_WithS4&Object&G {
+  synthetic constructor •() → self::WithS4
+    ;
+}
+abstract class _WithS5&Object&G = core::Object with self::G<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS5&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS5 extends self::_WithS5&Object&G {
+  synthetic constructor •() → self::WithS5
+    ;
+}
+abstract class _WithS6&Object&G = core::Object with self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS6&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS6 extends self::_WithS6&Object&G {
+  synthetic constructor •() → self::WithS6
+    ;
+}
+abstract class _WithS7&Object&G = core::Object with self::G<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS7&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS7 extends self::_WithS7&Object&G {
+  synthetic constructor •() → self::WithS7
+    ;
+}
+abstract class _WithS8&Object&G = core::Object with self::G<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS8&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS8 extends self::_WithS8&Object&G {
+  synthetic constructor •() → self::WithS8
+    ;
+}
+class EnumImplementsT1 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT1> values = const <self::EnumImplementsT1>[self::EnumImplementsT1::a];
+  static const field self::EnumImplementsT1 a = const self::EnumImplementsT1::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT2 extends core::_Enum implements self::Class<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT2> values = const <self::EnumImplementsT2>[self::EnumImplementsT2::a];
+  static const field self::EnumImplementsT2 a = const self::EnumImplementsT2::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT3 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT3> values = const <self::EnumImplementsT3>[self::EnumImplementsT3::a];
+  static const field self::EnumImplementsT3 a = const self::EnumImplementsT3::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT4 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT4> values = const <self::EnumImplementsT4>[self::EnumImplementsT4::a];
+  static const field self::EnumImplementsT4 a = const self::EnumImplementsT4::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT5 extends core::_Enum implements self::Class<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT5> values = const <self::EnumImplementsT5>[self::EnumImplementsT5::a];
+  static const field self::EnumImplementsT5 a = const self::EnumImplementsT5::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT6 extends core::_Enum implements self::Class<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT6> values = const <self::EnumImplementsT6>[self::EnumImplementsT6::a];
+  static const field self::EnumImplementsT6 a = const self::EnumImplementsT6::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT7 extends core::_Enum implements self::Class<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT7> values = const <self::EnumImplementsT7>[self::EnumImplementsT7::a];
+  static const field self::EnumImplementsT7 a = const self::EnumImplementsT7::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT8 extends core::_Enum implements self::Class<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT8> values = const <self::EnumImplementsT8>[self::EnumImplementsT8::a];
+  static const field self::EnumImplementsT8 a = const self::EnumImplementsT8::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT8.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS1 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS1> values = const <self::EnumImplementsS1>[self::EnumImplementsS1::a];
+  static const field self::EnumImplementsS1 a = const self::EnumImplementsS1::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS2 extends core::_Enum implements self::G<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS2> values = const <self::EnumImplementsS2>[self::EnumImplementsS2::a];
+  static const field self::EnumImplementsS2 a = const self::EnumImplementsS2::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS3 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS3> values = const <self::EnumImplementsS3>[self::EnumImplementsS3::a];
+  static const field self::EnumImplementsS3 a = const self::EnumImplementsS3::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS4 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS4> values = const <self::EnumImplementsS4>[self::EnumImplementsS4::a];
+  static const field self::EnumImplementsS4 a = const self::EnumImplementsS4::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS5 extends core::_Enum implements self::G<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS5> values = const <self::EnumImplementsS5>[self::EnumImplementsS5::a];
+  static const field self::EnumImplementsS5 a = const self::EnumImplementsS5::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS6 extends core::_Enum implements self::G<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS6> values = const <self::EnumImplementsS6>[self::EnumImplementsS6::a];
+  static const field self::EnumImplementsS6 a = const self::EnumImplementsS6::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS7 extends core::_Enum implements self::G<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS7> values = const <self::EnumImplementsS7>[self::EnumImplementsS7::a];
+  static const field self::EnumImplementsS7 a = const self::EnumImplementsS7::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS8 extends core::_Enum implements self::G<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS8> values = const <self::EnumImplementsS8>[self::EnumImplementsS8::a];
+  static const field self::EnumImplementsS8 a = const self::EnumImplementsS8::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT1&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT1&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT1 extends self::_EnumWithT1&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT1> values = const <self::EnumWithT1>[self::EnumWithT1::a];
+  static const field self::EnumWithT1 a = const self::EnumWithT1::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT1
+    ;
+  method toString() → core::String
+    return "EnumWithT1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT2&_Enum&F = core::_Enum with self::Class<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT2&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT2 extends self::_EnumWithT2&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT2> values = const <self::EnumWithT2>[self::EnumWithT2::a];
+  static const field self::EnumWithT2 a = const self::EnumWithT2::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT2
+    ;
+  method toString() → core::String
+    return "EnumWithT2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT3&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT3&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT3 extends self::_EnumWithT3&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT3> values = const <self::EnumWithT3>[self::EnumWithT3::a];
+  static const field self::EnumWithT3 a = const self::EnumWithT3::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT3
+    ;
+  method toString() → core::String
+    return "EnumWithT3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT4&_Enum&F = core::_Enum with self::Class<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT4&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT4 extends self::_EnumWithT4&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT4> values = const <self::EnumWithT4>[self::EnumWithT4::a];
+  static const field self::EnumWithT4 a = const self::EnumWithT4::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT4
+    ;
+  method toString() → core::String
+    return "EnumWithT4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT5&_Enum&F = core::_Enum with self::Class<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT5&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT5 extends self::_EnumWithT5&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT5> values = const <self::EnumWithT5>[self::EnumWithT5::a];
+  static const field self::EnumWithT5 a = const self::EnumWithT5::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT5
+    ;
+  method toString() → core::String
+    return "EnumWithT5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT6&_Enum&F = core::_Enum with self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT6&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT6 extends self::_EnumWithT6&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT6> values = const <self::EnumWithT6>[self::EnumWithT6::a];
+  static const field self::EnumWithT6 a = const self::EnumWithT6::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT6
+    ;
+  method toString() → core::String
+    return "EnumWithT6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT7&_Enum&F = core::_Enum with self::Class<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT7&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT7 extends self::_EnumWithT7&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT7> values = const <self::EnumWithT7>[self::EnumWithT7::a];
+  static const field self::EnumWithT7 a = const self::EnumWithT7::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT7
+    ;
+  method toString() → core::String
+    return "EnumWithT7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT8&_Enum&F = core::_Enum with self::Class<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT8&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT8 extends self::_EnumWithT8&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT8> values = const <self::EnumWithT8>[self::EnumWithT8::a];
+  static const field self::EnumWithT8 a = const self::EnumWithT8::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithT8
+    ;
+  method toString() → core::String
+    return "EnumWithT8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS1&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS1&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS1 extends self::_EnumWithS1&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS1> values = const <self::EnumWithS1>[self::EnumWithS1::a];
+  static const field self::EnumWithS1 a = const self::EnumWithS1::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS1
+    ;
+  method toString() → core::String
+    return "EnumWithS1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS2&_Enum&G = core::_Enum with self::G<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS2&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS2 extends self::_EnumWithS2&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS2> values = const <self::EnumWithS2>[self::EnumWithS2::a];
+  static const field self::EnumWithS2 a = const self::EnumWithS2::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS2
+    ;
+  method toString() → core::String
+    return "EnumWithS2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS3&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS3&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS3 extends self::_EnumWithS3&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS3> values = const <self::EnumWithS3>[self::EnumWithS3::a];
+  static const field self::EnumWithS3 a = const self::EnumWithS3::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS3
+    ;
+  method toString() → core::String
+    return "EnumWithS3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS4&_Enum&G = core::_Enum with self::G<self::Class<dynamic>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS4&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS4 extends self::_EnumWithS4&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS4> values = const <self::EnumWithS4>[self::EnumWithS4::a];
+  static const field self::EnumWithS4 a = const self::EnumWithS4::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS4
+    ;
+  method toString() → core::String
+    return "EnumWithS4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS5&_Enum&G = core::_Enum with self::G<self::ConcreteClass> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS5&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS5 extends self::_EnumWithS5&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS5> values = const <self::EnumWithS5>[self::EnumWithS5::a];
+  static const field self::EnumWithS5 a = const self::EnumWithS5::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS5
+    ;
+  method toString() → core::String
+    return "EnumWithS5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS6&_Enum&G = core::_Enum with self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS6&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS6 extends self::_EnumWithS6&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS6> values = const <self::EnumWithS6>[self::EnumWithS6::a];
+  static const field self::EnumWithS6 a = const self::EnumWithS6::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS6
+    ;
+  method toString() → core::String
+    return "EnumWithS6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS7&_Enum&G = core::_Enum with self::G<core::Object> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS7&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS7 extends self::_EnumWithS7&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS7> values = const <self::EnumWithS7>[self::EnumWithS7::a];
+  static const field self::EnumWithS7 a = const self::EnumWithS7::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS7
+    ;
+  method toString() → core::String
+    return "EnumWithS7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS8&_Enum&G = core::_Enum with self::G<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS8&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS8 extends self::_EnumWithS8&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS8> values = const <self::EnumWithS8>[self::EnumWithS8::a];
+  static const field self::EnumWithS8 a = const self::EnumWithS8::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::EnumWithS8
+    ;
+  method toString() → core::String
+    return "EnumWithS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnT1 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT2 extends self::Class<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT3 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT4 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT5 extends self::Class<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT6 extends self::Class<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT7 extends self::Class<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT8 extends self::Class<core::int> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS1 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS2 extends self::G<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS3 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS4 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS5 extends self::G<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS6 extends self::G<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS7 extends self::G<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS8 extends self::G<core::int> /*isMixinDeclaration*/  {
+}
+extension ExtensionOnT1 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT2 on self::Class<dynamic> {
+}
+extension ExtensionOnT3 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT4 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT5 on self::Class<self::ConcreteClass> {
+}
+extension ExtensionOnT6 on self::Class<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnT7 on self::Class<core::Object> {
+}
+extension ExtensionOnT8 on self::Class<core::int> {
+}
+extension ExtensionOnS1 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS2 on self::G<dynamic> {
+}
+extension ExtensionOnS3 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS4 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS5 on self::G<self::ConcreteClass> {
+}
+extension ExtensionOnS6 on self::G<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnS7 on self::G<core::Object> {
+}
+extension ExtensionOnS8 on self::G<core::int> {
+}
+static method main() → dynamic
+  ;
+static method _#F#new#tearOff<X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class<self::_#F#new#tearOff::X>
+  return new self::Class::•<self::_#F#new#tearOff::X>();
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:109:6 -> ListConstant(const <EnumImplementsT1*>[const EnumImplementsT1{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:109:50 -> InstanceConstant(const EnumImplementsT1{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:111:6 -> ListConstant(const <EnumImplementsT2*>[const EnumImplementsT2{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:111:59 -> InstanceConstant(const EnumImplementsT2{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:113:6 -> ListConstant(const <EnumImplementsT3*>[const EnumImplementsT3{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:113:57 -> InstanceConstant(const EnumImplementsT3{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:115:6 -> ListConstant(const <EnumImplementsT4*>[const EnumImplementsT4{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:115:66 -> InstanceConstant(const EnumImplementsT4{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:117:6 -> ListConstant(const <EnumImplementsT5*>[const EnumImplementsT5{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:117:62 -> InstanceConstant(const EnumImplementsT5{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:119:6 -> ListConstant(const <EnumImplementsT6*>[const EnumImplementsT6{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:119:69 -> InstanceConstant(const EnumImplementsT6{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:121:6 -> ListConstant(const <EnumImplementsT7*>[const EnumImplementsT7{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:121:58 -> InstanceConstant(const EnumImplementsT7{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:123:6 -> ListConstant(const <EnumImplementsT8*>[const EnumImplementsT8{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:123:55 -> InstanceConstant(const EnumImplementsT8{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:125:6 -> ListConstant(const <EnumImplementsS1*>[const EnumImplementsS1{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:125:50 -> InstanceConstant(const EnumImplementsS1{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:127:6 -> ListConstant(const <EnumImplementsS2*>[const EnumImplementsS2{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:127:59 -> InstanceConstant(const EnumImplementsS2{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:129:6 -> ListConstant(const <EnumImplementsS3*>[const EnumImplementsS3{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:129:57 -> InstanceConstant(const EnumImplementsS3{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:131:6 -> ListConstant(const <EnumImplementsS4*>[const EnumImplementsS4{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:131:66 -> InstanceConstant(const EnumImplementsS4{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:133:6 -> ListConstant(const <EnumImplementsS5*>[const EnumImplementsS5{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:133:62 -> InstanceConstant(const EnumImplementsS5{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:135:6 -> ListConstant(const <EnumImplementsS6*>[const EnumImplementsS6{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:135:69 -> InstanceConstant(const EnumImplementsS6{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:137:6 -> ListConstant(const <EnumImplementsS7*>[const EnumImplementsS7{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:137:58 -> InstanceConstant(const EnumImplementsS7{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:139:6 -> ListConstant(const <EnumImplementsS8*>[const EnumImplementsS8{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:139:55 -> InstanceConstant(const EnumImplementsS8{_Enum.index: 0, _Enum._name: "a"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:141:6 -> ListConstant(const <EnumWithT1*>[const EnumWithT1{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:141:38 -> InstanceConstant(const EnumWithT1{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:143:6 -> ListConstant(const <EnumWithT2*>[const EnumWithT2{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:143:47 -> InstanceConstant(const EnumWithT2{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:145:6 -> ListConstant(const <EnumWithT3*>[const EnumWithT3{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:145:45 -> InstanceConstant(const EnumWithT3{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:147:6 -> ListConstant(const <EnumWithT4*>[const EnumWithT4{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:147:54 -> InstanceConstant(const EnumWithT4{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:149:6 -> ListConstant(const <EnumWithT5*>[const EnumWithT5{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:149:50 -> InstanceConstant(const EnumWithT5{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:151:6 -> ListConstant(const <EnumWithT6*>[const EnumWithT6{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:151:57 -> InstanceConstant(const EnumWithT6{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:153:6 -> ListConstant(const <EnumWithT7*>[const EnumWithT7{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:153:46 -> InstanceConstant(const EnumWithT7{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:155:6 -> ListConstant(const <EnumWithT8*>[const EnumWithT8{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:155:43 -> InstanceConstant(const EnumWithT8{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:157:6 -> ListConstant(const <EnumWithS1*>[const EnumWithS1{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:157:38 -> InstanceConstant(const EnumWithS1{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:159:6 -> ListConstant(const <EnumWithS2*>[const EnumWithS2{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:159:47 -> InstanceConstant(const EnumWithS2{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:161:6 -> ListConstant(const <EnumWithS3*>[const EnumWithS3{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:161:45 -> InstanceConstant(const EnumWithS3{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:163:6 -> ListConstant(const <EnumWithS4*>[const EnumWithS4{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:163:54 -> InstanceConstant(const EnumWithS4{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:165:6 -> ListConstant(const <EnumWithS5*>[const EnumWithS5{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:165:50 -> InstanceConstant(const EnumWithS5{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:167:6 -> ListConstant(const <EnumWithS6*>[const EnumWithS6{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:167:57 -> InstanceConstant(const EnumWithS6{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:169:6 -> ListConstant(const <EnumWithS7*>[const EnumWithS7{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:169:46 -> InstanceConstant(const EnumWithS7{})
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_supertypes.dart:171:6 -> ListConstant(const <EnumWithS8*>[const EnumWithS8{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///bounds_supertypes.dart:171:43 -> InstanceConstant(const EnumWithS8{})
+Extra constant evaluation: evaluated: 225, effectively constant: 64
diff --git a/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.transformed.expect
new file mode 100644
index 0000000..c15302b
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_supertypes.dart.weak.transformed.expect
@@ -0,0 +1,1599 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:13:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsT1 extends F {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:15:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT2 extends F<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:17:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT3 extends F<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:19:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT4 extends F<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:25:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT7 extends F<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:27:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsT8 extends F<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:29:25: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ExtendsS1 extends G {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:31:25: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS2 extends G<dynamic> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:33:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS3 extends G<Class> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:35:25: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS4 extends G<Class<dynamic>> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:41:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS7 extends G<Object> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:43:25: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ExtendsS8 extends G<int> {} // Error
+//                         ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:45:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsT1 implements F {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:47:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT2 implements F<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:49:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT3 implements F<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:51:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT4 implements F<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:57:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT7 implements F<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:59:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsT8 implements F<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:61:31: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class ImplementsS1 implements G {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:63:31: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS2 implements G<dynamic> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:65:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS3 implements G<Class> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:67:31: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS4 implements G<Class<dynamic>> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:73:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS7 implements G<Object> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:75:31: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class ImplementsS8 implements G<int> {} // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:77:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithT1 with F {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:79:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT2 with F<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:81:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT3 with F<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:83:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT4 with F<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:89: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT7 with F<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:91: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithT8 with F<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:109:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsT1 implements F /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:111:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT2 implements F<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:113:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT3 implements F<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:115:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT4 implements F<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:121:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT7 implements F<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:123:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsT8 implements F<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:125:34: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumImplementsS1 implements G /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:127:34: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS2 implements G<dynamic> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:129:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS3 implements G<Class> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:131:34: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS4 implements G<Class<dynamic>> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:137:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS7 implements G<Object> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:139:34: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumImplementsS8 implements G<int> /* Error */ { a }
+//                                  ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:141:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithT1 with F /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:143:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT2 with F<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:145:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT3 with F<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:147:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT4 with F<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:153:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT7 with F<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:155:22: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithT8 with F<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:173:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnT1 on F {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:175:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT2 on F<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:177:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT3 on F<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:179:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'F'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT4 on F<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:185: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT7 on F<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:187: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnT8 on F<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:189:20: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// mixin MixinOnS1 on G {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:191:20: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS2 on G<dynamic> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:193:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS3 on G<Class> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:195:20: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS4 on G<Class<dynamic>> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:201: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS7 on G<Object> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:203: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// mixin MixinOnS8 on G<int> {} // Error
+//                    ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:217:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT7 on F<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:219:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnT8 on F<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends Class<X>> = Class<X>;
+//           ^
+//
+// pkg/front_end/testcases/general/bounds_supertypes.dart:233:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS7 on G<Object> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:235:28: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ExtensionOnS8 on G<int> {} // Error
+//                            ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:93:19: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// class WithS1 with G {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:95:19: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS2 with G<dynamic> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:97:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS3 with G<Class> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:99:19: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS4 with G<Class<dynamic>> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:105:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS7 with G<Object> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:107:19: 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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class WithS8 with G<int> {} // Error
+//                   ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:157:22: Error: Inferred type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// enum EnumWithS1 with G /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:159:22: Error: Type argument 'dynamic' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS2 with G<dynamic> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:161:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS3 with G<Class> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:163:22: Error: Type argument 'Class<dynamic>' doesn't conform to the bound 'Class<X>' of the type variable 'X' on 'G'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS4 with G<Class<dynamic>> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:169: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS7 with G<Object> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.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_supertypes.dart:171: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_supertypes.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// enum EnumWithS8 with G<int> /* Error */ { a }
+//                      ^
+// pkg/front_end/testcases/general/bounds_supertypes.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = self::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class ExtendsT1 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT1
+    : super self::Class::•()
+    ;
+}
+class ExtendsT2 extends self::Class<dynamic> {
+  synthetic constructor •() → self::ExtendsT2
+    : super self::Class::•()
+    ;
+}
+class ExtendsT3 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT3
+    : super self::Class::•()
+    ;
+}
+class ExtendsT4 extends self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsT4
+    : super self::Class::•()
+    ;
+}
+class ExtendsT5 extends self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsT5
+    : super self::Class::•()
+    ;
+}
+class ExtendsT6 extends self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsT6
+    : super self::Class::•()
+    ;
+}
+class ExtendsT7 extends self::Class<core::Object> {
+  synthetic constructor •() → self::ExtendsT7
+    : super self::Class::•()
+    ;
+}
+class ExtendsT8 extends self::Class<core::int> {
+  synthetic constructor •() → self::ExtendsT8
+    : super self::Class::•()
+    ;
+}
+class ExtendsS1 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS1
+    : super self::G::•()
+    ;
+}
+class ExtendsS2 extends self::G<dynamic> {
+  synthetic constructor •() → self::ExtendsS2
+    : super self::G::•()
+    ;
+}
+class ExtendsS3 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS3
+    : super self::G::•()
+    ;
+}
+class ExtendsS4 extends self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ExtendsS4
+    : super self::G::•()
+    ;
+}
+class ExtendsS5 extends self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ExtendsS5
+    : super self::G::•()
+    ;
+}
+class ExtendsS6 extends self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ExtendsS6
+    : super self::G::•()
+    ;
+}
+class ExtendsS7 extends self::G<core::Object> {
+  synthetic constructor •() → self::ExtendsS7
+    : super self::G::•()
+    ;
+}
+class ExtendsS8 extends self::G<core::int> {
+  synthetic constructor •() → self::ExtendsS8
+    : super self::G::•()
+    ;
+}
+class ImplementsT1 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT1
+    : super core::Object::•()
+    ;
+}
+class ImplementsT2 extends core::Object implements self::Class<dynamic> {
+  synthetic constructor •() → self::ImplementsT2
+    : super core::Object::•()
+    ;
+}
+class ImplementsT3 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT3
+    : super core::Object::•()
+    ;
+}
+class ImplementsT4 extends core::Object implements self::Class<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsT4
+    : super core::Object::•()
+    ;
+}
+class ImplementsT5 extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsT5
+    : super core::Object::•()
+    ;
+}
+class ImplementsT6 extends core::Object implements self::Class<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsT6
+    : super core::Object::•()
+    ;
+}
+class ImplementsT7 extends core::Object implements self::Class<core::Object> {
+  synthetic constructor •() → self::ImplementsT7
+    : super core::Object::•()
+    ;
+}
+class ImplementsT8 extends core::Object implements self::Class<core::int> {
+  synthetic constructor •() → self::ImplementsT8
+    : super core::Object::•()
+    ;
+}
+class ImplementsS1 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS1
+    : super core::Object::•()
+    ;
+}
+class ImplementsS2 extends core::Object implements self::G<dynamic> {
+  synthetic constructor •() → self::ImplementsS2
+    : super core::Object::•()
+    ;
+}
+class ImplementsS3 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS3
+    : super core::Object::•()
+    ;
+}
+class ImplementsS4 extends core::Object implements self::G<self::Class<dynamic>> {
+  synthetic constructor •() → self::ImplementsS4
+    : super core::Object::•()
+    ;
+}
+class ImplementsS5 extends core::Object implements self::G<self::ConcreteClass> {
+  synthetic constructor •() → self::ImplementsS5
+    : super core::Object::•()
+    ;
+}
+class ImplementsS6 extends core::Object implements self::G<self::Class<self::ConcreteClass>> {
+  synthetic constructor •() → self::ImplementsS6
+    : super core::Object::•()
+    ;
+}
+class ImplementsS7 extends core::Object implements self::G<core::Object> {
+  synthetic constructor •() → self::ImplementsS7
+    : super core::Object::•()
+    ;
+}
+class ImplementsS8 extends core::Object implements self::G<core::int> {
+  synthetic constructor •() → self::ImplementsS8
+    : super core::Object::•()
+    ;
+}
+abstract class _WithT1&Object&F extends core::Object implements self::Class<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT1&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT1 extends self::_WithT1&Object&F {
+  synthetic constructor •() → self::WithT1
+    : super self::_WithT1&Object&F::•()
+    ;
+}
+abstract class _WithT2&Object&F extends core::Object implements self::Class<dynamic> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT2&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT2 extends self::_WithT2&Object&F {
+  synthetic constructor •() → self::WithT2
+    : super self::_WithT2&Object&F::•()
+    ;
+}
+abstract class _WithT3&Object&F extends core::Object implements self::Class<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT3&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT3 extends self::_WithT3&Object&F {
+  synthetic constructor •() → self::WithT3
+    : super self::_WithT3&Object&F::•()
+    ;
+}
+abstract class _WithT4&Object&F extends core::Object implements self::Class<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT4&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT4 extends self::_WithT4&Object&F {
+  synthetic constructor •() → self::WithT4
+    : super self::_WithT4&Object&F::•()
+    ;
+}
+abstract class _WithT5&Object&F extends core::Object implements self::Class<self::ConcreteClass> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT5&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT5 extends self::_WithT5&Object&F {
+  synthetic constructor •() → self::WithT5
+    : super self::_WithT5&Object&F::•()
+    ;
+}
+abstract class _WithT6&Object&F extends core::Object implements self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT6&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT6 extends self::_WithT6&Object&F {
+  synthetic constructor •() → self::WithT6
+    : super self::_WithT6&Object&F::•()
+    ;
+}
+abstract class _WithT7&Object&F extends core::Object implements self::Class<core::Object> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT7&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT7 extends self::_WithT7&Object&F {
+  synthetic constructor •() → self::WithT7
+    : super self::_WithT7&Object&F::•()
+    ;
+}
+abstract class _WithT8&Object&F extends core::Object implements self::Class<core::int> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithT8&Object&F
+    : super core::Object::•()
+    ;
+}
+class WithT8 extends self::_WithT8&Object&F {
+  synthetic constructor •() → self::WithT8
+    : super self::_WithT8&Object&F::•()
+    ;
+}
+abstract class _WithS1&Object&G extends core::Object implements self::G<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS1&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS1 extends self::_WithS1&Object&G {
+  synthetic constructor •() → self::WithS1
+    : super self::_WithS1&Object&G::•()
+    ;
+}
+abstract class _WithS2&Object&G extends core::Object implements self::G<dynamic> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS2&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS2 extends self::_WithS2&Object&G {
+  synthetic constructor •() → self::WithS2
+    : super self::_WithS2&Object&G::•()
+    ;
+}
+abstract class _WithS3&Object&G extends core::Object implements self::G<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS3&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS3 extends self::_WithS3&Object&G {
+  synthetic constructor •() → self::WithS3
+    : super self::_WithS3&Object&G::•()
+    ;
+}
+abstract class _WithS4&Object&G extends core::Object implements self::G<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS4&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS4 extends self::_WithS4&Object&G {
+  synthetic constructor •() → self::WithS4
+    : super self::_WithS4&Object&G::•()
+    ;
+}
+abstract class _WithS5&Object&G extends core::Object implements self::G<self::ConcreteClass> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS5&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS5 extends self::_WithS5&Object&G {
+  synthetic constructor •() → self::WithS5
+    : super self::_WithS5&Object&G::•()
+    ;
+}
+abstract class _WithS6&Object&G extends core::Object implements self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS6&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS6 extends self::_WithS6&Object&G {
+  synthetic constructor •() → self::WithS6
+    : super self::_WithS6&Object&G::•()
+    ;
+}
+abstract class _WithS7&Object&G extends core::Object implements self::G<core::Object> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS7&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS7 extends self::_WithS7&Object&G {
+  synthetic constructor •() → self::WithS7
+    : super self::_WithS7&Object&G::•()
+    ;
+}
+abstract class _WithS8&Object&G extends core::Object implements self::G<core::int> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_WithS8&Object&G
+    : super core::Object::•()
+    ;
+}
+class WithS8 extends self::_WithS8&Object&G {
+  synthetic constructor •() → self::WithS8
+    : super self::_WithS8&Object&G::•()
+    ;
+}
+class EnumImplementsT1 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT1> values = #C4;
+  static const field self::EnumImplementsT1 a = #C3;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT2 extends core::_Enum implements self::Class<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT2> values = #C6;
+  static const field self::EnumImplementsT2 a = #C5;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT3 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT3> values = #C8;
+  static const field self::EnumImplementsT3 a = #C7;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT4 extends core::_Enum implements self::Class<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT4> values = #C10;
+  static const field self::EnumImplementsT4 a = #C9;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT5 extends core::_Enum implements self::Class<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT5> values = #C12;
+  static const field self::EnumImplementsT5 a = #C11;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT6 extends core::_Enum implements self::Class<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT6> values = #C14;
+  static const field self::EnumImplementsT6 a = #C13;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT7 extends core::_Enum implements self::Class<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT7> values = #C16;
+  static const field self::EnumImplementsT7 a = #C15;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsT8 extends core::_Enum implements self::Class<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsT8> values = #C18;
+  static const field self::EnumImplementsT8 a = #C17;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsT8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsT8.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS1 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS1> values = #C20;
+  static const field self::EnumImplementsS1 a = #C19;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS1.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS2 extends core::_Enum implements self::G<dynamic> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS2> values = #C22;
+  static const field self::EnumImplementsS2 a = #C21;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS2.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS3 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS3> values = #C24;
+  static const field self::EnumImplementsS3 a = #C23;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS3.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS4 extends core::_Enum implements self::G<self::Class<dynamic>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS4> values = #C26;
+  static const field self::EnumImplementsS4 a = #C25;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS4.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS5 extends core::_Enum implements self::G<self::ConcreteClass> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS5> values = #C28;
+  static const field self::EnumImplementsS5 a = #C27;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS5.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS6 extends core::_Enum implements self::G<self::Class<self::ConcreteClass>> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS6> values = #C30;
+  static const field self::EnumImplementsS6 a = #C29;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS6.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS7 extends core::_Enum implements self::G<core::Object> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS7> values = #C32;
+  static const field self::EnumImplementsS7 a = #C31;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS7
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS7.${this.{core::_Enum::_name}{core::String}}";
+}
+class EnumImplementsS8 extends core::_Enum implements self::G<core::int> /*isEnum*/  {
+  static const field core::List<self::EnumImplementsS8> values = #C34;
+  static const field self::EnumImplementsS8 a = #C33;
+  const constructor •(core::int index, core::String name) → self::EnumImplementsS8
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumImplementsS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT1&_Enum&F extends core::_Enum implements self::Class<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT1&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT1 extends self::_EnumWithT1&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT1> values = #C36;
+  static const field self::EnumWithT1 a = #C35;
+  const constructor •(core::int index, core::String name) → self::EnumWithT1
+    : super self::_EnumWithT1&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT2&_Enum&F extends core::_Enum implements self::Class<dynamic> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT2&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT2 extends self::_EnumWithT2&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT2> values = #C38;
+  static const field self::EnumWithT2 a = #C37;
+  const constructor •(core::int index, core::String name) → self::EnumWithT2
+    : super self::_EnumWithT2&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT3&_Enum&F extends core::_Enum implements self::Class<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT3&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT3 extends self::_EnumWithT3&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT3> values = #C40;
+  static const field self::EnumWithT3 a = #C39;
+  const constructor •(core::int index, core::String name) → self::EnumWithT3
+    : super self::_EnumWithT3&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT4&_Enum&F extends core::_Enum implements self::Class<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT4&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT4 extends self::_EnumWithT4&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT4> values = #C42;
+  static const field self::EnumWithT4 a = #C41;
+  const constructor •(core::int index, core::String name) → self::EnumWithT4
+    : super self::_EnumWithT4&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT5&_Enum&F extends core::_Enum implements self::Class<self::ConcreteClass> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT5&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT5 extends self::_EnumWithT5&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT5> values = #C44;
+  static const field self::EnumWithT5 a = #C43;
+  const constructor •(core::int index, core::String name) → self::EnumWithT5
+    : super self::_EnumWithT5&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT6&_Enum&F extends core::_Enum implements self::Class<self::Class<self::ConcreteClass>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT6&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT6 extends self::_EnumWithT6&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT6> values = #C46;
+  static const field self::EnumWithT6 a = #C45;
+  const constructor •(core::int index, core::String name) → self::EnumWithT6
+    : super self::_EnumWithT6&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT7&_Enum&F extends core::_Enum implements self::Class<core::Object> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT7&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT7 extends self::_EnumWithT7&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT7> values = #C48;
+  static const field self::EnumWithT7 a = #C47;
+  const constructor •(core::int index, core::String name) → self::EnumWithT7
+    : super self::_EnumWithT7&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithT8&_Enum&F extends core::_Enum implements self::Class<core::int> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithT8&_Enum&F
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithT8 extends self::_EnumWithT8&_Enum&F /*isEnum*/  {
+  static const field core::List<self::EnumWithT8> values = #C50;
+  static const field self::EnumWithT8 a = #C49;
+  const constructor •(core::int index, core::String name) → self::EnumWithT8
+    : super self::_EnumWithT8&_Enum&F::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithT8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS1&_Enum&G extends core::_Enum implements self::G<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS1&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS1 extends self::_EnumWithS1&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS1> values = #C52;
+  static const field self::EnumWithS1 a = #C51;
+  const constructor •(core::int index, core::String name) → self::EnumWithS1
+    : super self::_EnumWithS1&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS1.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS2&_Enum&G extends core::_Enum implements self::G<dynamic> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS2&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS2 extends self::_EnumWithS2&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS2> values = #C54;
+  static const field self::EnumWithS2 a = #C53;
+  const constructor •(core::int index, core::String name) → self::EnumWithS2
+    : super self::_EnumWithS2&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS2.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS3&_Enum&G extends core::_Enum implements self::G<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS3&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS3 extends self::_EnumWithS3&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS3> values = #C56;
+  static const field self::EnumWithS3 a = #C55;
+  const constructor •(core::int index, core::String name) → self::EnumWithS3
+    : super self::_EnumWithS3&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS3.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS4&_Enum&G extends core::_Enum implements self::G<self::Class<dynamic>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS4&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS4 extends self::_EnumWithS4&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS4> values = #C58;
+  static const field self::EnumWithS4 a = #C57;
+  const constructor •(core::int index, core::String name) → self::EnumWithS4
+    : super self::_EnumWithS4&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS5&_Enum&G extends core::_Enum implements self::G<self::ConcreteClass> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS5&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS5 extends self::_EnumWithS5&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS5> values = #C60;
+  static const field self::EnumWithS5 a = #C59;
+  const constructor •(core::int index, core::String name) → self::EnumWithS5
+    : super self::_EnumWithS5&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS6&_Enum&G extends core::_Enum implements self::G<self::Class<self::ConcreteClass>> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS6&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS6 extends self::_EnumWithS6&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS6> values = #C62;
+  static const field self::EnumWithS6 a = #C61;
+  const constructor •(core::int index, core::String name) → self::EnumWithS6
+    : super self::_EnumWithS6&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS7&_Enum&G extends core::_Enum implements self::G<core::Object> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS7&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS7 extends self::_EnumWithS7&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS7> values = #C64;
+  static const field self::EnumWithS7 a = #C63;
+  const constructor •(core::int index, core::String name) → self::EnumWithS7
+    : super self::_EnumWithS7&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS7.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class _EnumWithS8&_Enum&G extends core::_Enum implements self::G<core::int> /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_EnumWithS8&_Enum&G
+    : super core::_Enum::•(index, _name)
+    ;
+}
+class EnumWithS8 extends self::_EnumWithS8&_Enum&G /*isEnum*/  {
+  static const field core::List<self::EnumWithS8> values = #C66;
+  static const field self::EnumWithS8 a = #C65;
+  const constructor •(core::int index, core::String name) → self::EnumWithS8
+    : super self::_EnumWithS8&_Enum&G::•(index, name)
+    ;
+  method toString() → core::String
+    return "EnumWithS8.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MixinOnT1 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT2 extends self::Class<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT3 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT4 extends self::Class<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT5 extends self::Class<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT6 extends self::Class<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT7 extends self::Class<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnT8 extends self::Class<core::int> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS1 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS2 extends self::G<dynamic> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS3 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS4 extends self::G<self::Class<dynamic>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS5 extends self::G<self::ConcreteClass> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS6 extends self::G<self::Class<self::ConcreteClass>> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS7 extends self::G<core::Object> /*isMixinDeclaration*/  {
+}
+abstract class MixinOnS8 extends self::G<core::int> /*isMixinDeclaration*/  {
+}
+extension ExtensionOnT1 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT2 on self::Class<dynamic> {
+}
+extension ExtensionOnT3 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT4 on self::Class<self::Class<dynamic>> {
+}
+extension ExtensionOnT5 on self::Class<self::ConcreteClass> {
+}
+extension ExtensionOnT6 on self::Class<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnT7 on self::Class<core::Object> {
+}
+extension ExtensionOnT8 on self::Class<core::int> {
+}
+extension ExtensionOnS1 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS2 on self::G<dynamic> {
+}
+extension ExtensionOnS3 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS4 on self::G<self::Class<dynamic>> {
+}
+extension ExtensionOnS5 on self::G<self::ConcreteClass> {
+}
+extension ExtensionOnS6 on self::G<self::Class<self::ConcreteClass>> {
+}
+extension ExtensionOnS7 on self::G<core::Object> {
+}
+extension ExtensionOnS8 on self::G<core::int> {
+}
+static method main() → dynamic {}
+static method _#F#new#tearOff<X extends self::Class<self::_#F#new#tearOff::X> = self::Class<dynamic>>() → self::Class<self::_#F#new#tearOff::X>
+  return new self::Class::•<self::_#F#new#tearOff::X>();
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::EnumImplementsT1 {index:#C1, _name:#C2}
+  #C4 = <self::EnumImplementsT1*>[#C3]
+  #C5 = self::EnumImplementsT2 {index:#C1, _name:#C2}
+  #C6 = <self::EnumImplementsT2*>[#C5]
+  #C7 = self::EnumImplementsT3 {index:#C1, _name:#C2}
+  #C8 = <self::EnumImplementsT3*>[#C7]
+  #C9 = self::EnumImplementsT4 {index:#C1, _name:#C2}
+  #C10 = <self::EnumImplementsT4*>[#C9]
+  #C11 = self::EnumImplementsT5 {index:#C1, _name:#C2}
+  #C12 = <self::EnumImplementsT5*>[#C11]
+  #C13 = self::EnumImplementsT6 {index:#C1, _name:#C2}
+  #C14 = <self::EnumImplementsT6*>[#C13]
+  #C15 = self::EnumImplementsT7 {index:#C1, _name:#C2}
+  #C16 = <self::EnumImplementsT7*>[#C15]
+  #C17 = self::EnumImplementsT8 {index:#C1, _name:#C2}
+  #C18 = <self::EnumImplementsT8*>[#C17]
+  #C19 = self::EnumImplementsS1 {index:#C1, _name:#C2}
+  #C20 = <self::EnumImplementsS1*>[#C19]
+  #C21 = self::EnumImplementsS2 {index:#C1, _name:#C2}
+  #C22 = <self::EnumImplementsS2*>[#C21]
+  #C23 = self::EnumImplementsS3 {index:#C1, _name:#C2}
+  #C24 = <self::EnumImplementsS3*>[#C23]
+  #C25 = self::EnumImplementsS4 {index:#C1, _name:#C2}
+  #C26 = <self::EnumImplementsS4*>[#C25]
+  #C27 = self::EnumImplementsS5 {index:#C1, _name:#C2}
+  #C28 = <self::EnumImplementsS5*>[#C27]
+  #C29 = self::EnumImplementsS6 {index:#C1, _name:#C2}
+  #C30 = <self::EnumImplementsS6*>[#C29]
+  #C31 = self::EnumImplementsS7 {index:#C1, _name:#C2}
+  #C32 = <self::EnumImplementsS7*>[#C31]
+  #C33 = self::EnumImplementsS8 {index:#C1, _name:#C2}
+  #C34 = <self::EnumImplementsS8*>[#C33]
+  #C35 = self::EnumWithT1 {index:#C1, _name:#C2}
+  #C36 = <self::EnumWithT1*>[#C35]
+  #C37 = self::EnumWithT2 {index:#C1, _name:#C2}
+  #C38 = <self::EnumWithT2*>[#C37]
+  #C39 = self::EnumWithT3 {index:#C1, _name:#C2}
+  #C40 = <self::EnumWithT3*>[#C39]
+  #C41 = self::EnumWithT4 {index:#C1, _name:#C2}
+  #C42 = <self::EnumWithT4*>[#C41]
+  #C43 = self::EnumWithT5 {index:#C1, _name:#C2}
+  #C44 = <self::EnumWithT5*>[#C43]
+  #C45 = self::EnumWithT6 {index:#C1, _name:#C2}
+  #C46 = <self::EnumWithT6*>[#C45]
+  #C47 = self::EnumWithT7 {index:#C1, _name:#C2}
+  #C48 = <self::EnumWithT7*>[#C47]
+  #C49 = self::EnumWithT8 {index:#C1, _name:#C2}
+  #C50 = <self::EnumWithT8*>[#C49]
+  #C51 = self::EnumWithS1 {index:#C1, _name:#C2}
+  #C52 = <self::EnumWithS1*>[#C51]
+  #C53 = self::EnumWithS2 {index:#C1, _name:#C2}
+  #C54 = <self::EnumWithS2*>[#C53]
+  #C55 = self::EnumWithS3 {index:#C1, _name:#C2}
+  #C56 = <self::EnumWithS3*>[#C55]
+  #C57 = self::EnumWithS4 {index:#C1, _name:#C2}
+  #C58 = <self::EnumWithS4*>[#C57]
+  #C59 = self::EnumWithS5 {index:#C1, _name:#C2}
+  #C60 = <self::EnumWithS5*>[#C59]
+  #C61 = self::EnumWithS6 {index:#C1, _name:#C2}
+  #C62 = <self::EnumWithS6*>[#C61]
+  #C63 = self::EnumWithS7 {index:#C1, _name:#C2}
+  #C64 = <self::EnumWithS7*>[#C63]
+  #C65 = self::EnumWithS8 {index:#C1, _name:#C2}
+  #C66 = <self::EnumWithS8*>[#C65]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_supertypes.dart:
+- EnumImplementsT1. (from org-dartlang-testcase:///bounds_supertypes.dart:109:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- EnumImplementsT2. (from org-dartlang-testcase:///bounds_supertypes.dart:111:6)
+- EnumImplementsT3. (from org-dartlang-testcase:///bounds_supertypes.dart:113:6)
+- EnumImplementsT4. (from org-dartlang-testcase:///bounds_supertypes.dart:115:6)
+- EnumImplementsT5. (from org-dartlang-testcase:///bounds_supertypes.dart:117:6)
+- EnumImplementsT6. (from org-dartlang-testcase:///bounds_supertypes.dart:119:6)
+- EnumImplementsT7. (from org-dartlang-testcase:///bounds_supertypes.dart:121:6)
+- EnumImplementsT8. (from org-dartlang-testcase:///bounds_supertypes.dart:123:6)
+- EnumImplementsS1. (from org-dartlang-testcase:///bounds_supertypes.dart:125:6)
+- EnumImplementsS2. (from org-dartlang-testcase:///bounds_supertypes.dart:127:6)
+- EnumImplementsS3. (from org-dartlang-testcase:///bounds_supertypes.dart:129:6)
+- EnumImplementsS4. (from org-dartlang-testcase:///bounds_supertypes.dart:131:6)
+- EnumImplementsS5. (from org-dartlang-testcase:///bounds_supertypes.dart:133:6)
+- EnumImplementsS6. (from org-dartlang-testcase:///bounds_supertypes.dart:135:6)
+- EnumImplementsS7. (from org-dartlang-testcase:///bounds_supertypes.dart:137:6)
+- EnumImplementsS8. (from org-dartlang-testcase:///bounds_supertypes.dart:139:6)
+- EnumWithT1. (from org-dartlang-testcase:///bounds_supertypes.dart:141:6)
+- _EnumWithT1&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:141:6)
+- EnumWithT2. (from org-dartlang-testcase:///bounds_supertypes.dart:143:6)
+- _EnumWithT2&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:143:6)
+- EnumWithT3. (from org-dartlang-testcase:///bounds_supertypes.dart:145:6)
+- _EnumWithT3&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:145:6)
+- EnumWithT4. (from org-dartlang-testcase:///bounds_supertypes.dart:147:6)
+- _EnumWithT4&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:147:6)
+- EnumWithT5. (from org-dartlang-testcase:///bounds_supertypes.dart:149:6)
+- _EnumWithT5&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:149:6)
+- EnumWithT6. (from org-dartlang-testcase:///bounds_supertypes.dart:151:6)
+- _EnumWithT6&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:151:6)
+- EnumWithT7. (from org-dartlang-testcase:///bounds_supertypes.dart:153:6)
+- _EnumWithT7&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:153:6)
+- EnumWithT8. (from org-dartlang-testcase:///bounds_supertypes.dart:155:6)
+- _EnumWithT8&_Enum&F. (from org-dartlang-testcase:///bounds_supertypes.dart:155:6)
+- EnumWithS1. (from org-dartlang-testcase:///bounds_supertypes.dart:157:6)
+- _EnumWithS1&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:157:6)
+- EnumWithS2. (from org-dartlang-testcase:///bounds_supertypes.dart:159:6)
+- _EnumWithS2&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:159:6)
+- EnumWithS3. (from org-dartlang-testcase:///bounds_supertypes.dart:161:6)
+- _EnumWithS3&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:161:6)
+- EnumWithS4. (from org-dartlang-testcase:///bounds_supertypes.dart:163:6)
+- _EnumWithS4&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:163:6)
+- EnumWithS5. (from org-dartlang-testcase:///bounds_supertypes.dart:165:6)
+- _EnumWithS5&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:165:6)
+- EnumWithS6. (from org-dartlang-testcase:///bounds_supertypes.dart:167:6)
+- _EnumWithS6&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:167:6)
+- EnumWithS7. (from org-dartlang-testcase:///bounds_supertypes.dart:169:6)
+- _EnumWithS7&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:169:6)
+- EnumWithS8. (from org-dartlang-testcase:///bounds_supertypes.dart:171:6)
+- _EnumWithS8&_Enum&G. (from org-dartlang-testcase:///bounds_supertypes.dart:171:6)
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart b/pkg/front_end/testcases/general/bounds_type_aliases.dart
new file mode 100644
index 0000000..001c960
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+typedef T1 = F; // Error
+typedef T2 = F<dynamic>; // Error
+typedef T3 = F<Class>; // Error
+typedef T4 = F<Class<dynamic>>; // Error
+typedef T5 = F<ConcreteClass>; // Ok
+typedef T6 = F<Class<ConcreteClass>>; // Ok
+typedef T7 = F<Object>; // Error
+typedef T8 = F<int>; // Error
+
+typedef S1 = G; // Error
+typedef S2 = G<dynamic>; // Error
+typedef S3 = G<Class>; // Error
+typedef S4 = G<Class<dynamic>>; // Error
+typedef S5 = G<ConcreteClass>; // Ok
+typedef S6 = G<Class<ConcreteClass>>; // Ok
+typedef S7 = G<Object>; // Error
+typedef S8 = G<int>; // Error
+
+typedef Typedef1 = void Function<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    >();
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_type_aliases.dart.textual_outline.expect
new file mode 100644
index 0000000..1de49ae
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart.textual_outline.expect
@@ -0,0 +1,42 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+typedef T1 = F;
+typedef T2 = F<dynamic>;
+typedef T3 = F<Class>;
+typedef T4 = F<Class<dynamic>>;
+typedef T5 = F<ConcreteClass>;
+typedef T6 = F<Class<ConcreteClass>>;
+typedef T7 = F<Object>;
+typedef T8 = F<int>;
+typedef S1 = G;
+typedef S2 = G<dynamic>;
+typedef S3 = G<Class>;
+typedef S4 = G<Class<dynamic>>;
+typedef S5 = G<ConcreteClass>;
+typedef S6 = G<Class<ConcreteClass>>;
+typedef S7 = G<Object>;
+typedef S8 = G<int>;
+typedef Typedef1 = void Function<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>>();
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_type_aliases.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c61e199
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart.textual_outline_modelled.expect
@@ -0,0 +1,41 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+typedef F<X extends Class<X>> = X;
+typedef S1 = G;
+typedef S2 = G<dynamic>;
+typedef S3 = G<Class>;
+typedef S4 = G<Class<dynamic>>;
+typedef S5 = G<ConcreteClass>;
+typedef S6 = G<Class<ConcreteClass>>;
+typedef S7 = G<Object>;
+typedef S8 = G<int>;
+typedef T1 = F;
+typedef T2 = F<dynamic>;
+typedef T3 = F<Class>;
+typedef T4 = F<Class<dynamic>>;
+typedef T5 = F<ConcreteClass>;
+typedef T6 = F<Class<ConcreteClass>>;
+typedef T7 = F<Object>;
+typedef T8 = F<int>;
+typedef Typedef1 = void Function<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>>();
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.expect b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.expect
new file mode 100644
index 0000000..bc261f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.expect
@@ -0,0 +1,205 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:32: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:40: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:38: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:39: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T8 extends F<int>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:46: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S7 extends G<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:47: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S8 extends G<int> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:13:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef T1 = F; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:14:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T2 = F<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:15:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T3 = F<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:16:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T4 = F<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:19:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T7 = F<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:20:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T8 = F<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:22:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef S1 = G; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:23:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S2 = G<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:24:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S3 = G<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:25:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S4 = G<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:28:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S7 = G<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:29:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S8 = G<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef T1 = self::Class<dynamic>;
+typedef T2 = dynamic;
+typedef T3 = self::Class<dynamic>;
+typedef T4 = self::Class<dynamic>;
+typedef T5 = self::ConcreteClass;
+typedef T6 = self::Class<self::ConcreteClass>;
+typedef T7 = core::Object;
+typedef T8 = core::int;
+typedef S1 = self::G<self::Class<dynamic>>;
+typedef S2 = self::G<dynamic>;
+typedef S3 = self::G<self::Class<dynamic>>;
+typedef S4 = self::G<self::Class<dynamic>>;
+typedef S5 = self::G<self::ConcreteClass>;
+typedef S6 = self::G<self::Class<self::ConcreteClass>>;
+typedef S7 = self::G<core::Object>;
+typedef S8 = self::G<core::int>;
+typedef Typedef1 = <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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.modular.expect
new file mode 100644
index 0000000..bc261f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.modular.expect
@@ -0,0 +1,205 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:32: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:40: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:38: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:39: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T8 extends F<int>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:46: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S7 extends G<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:47: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S8 extends G<int> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:13:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef T1 = F; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:14:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T2 = F<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:15:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T3 = F<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:16:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T4 = F<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:19:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T7 = F<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:20:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T8 = F<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:22:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef S1 = G; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:23:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S2 = G<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:24:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S3 = G<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:25:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S4 = G<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:28:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S7 = G<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:29:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S8 = G<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef T1 = self::Class<dynamic>;
+typedef T2 = dynamic;
+typedef T3 = self::Class<dynamic>;
+typedef T4 = self::Class<dynamic>;
+typedef T5 = self::ConcreteClass;
+typedef T6 = self::Class<self::ConcreteClass>;
+typedef T7 = core::Object;
+typedef T8 = core::int;
+typedef S1 = self::G<self::Class<dynamic>>;
+typedef S2 = self::G<dynamic>;
+typedef S3 = self::G<self::Class<dynamic>>;
+typedef S4 = self::G<self::Class<dynamic>>;
+typedef S5 = self::G<self::ConcreteClass>;
+typedef S6 = self::G<self::Class<self::ConcreteClass>>;
+typedef S7 = self::G<core::Object>;
+typedef S8 = self::G<core::int>;
+typedef Typedef1 = <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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.outline.expect
new file mode 100644
index 0000000..0326770
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.outline.expect
@@ -0,0 +1,203 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:32: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:40: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:38: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:39: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T8 extends F<int>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:46: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S7 extends G<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:47: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S8 extends G<int> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:13:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef T1 = F; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:14:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T2 = F<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:15:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T3 = F<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:16:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T4 = F<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:19:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T7 = F<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:20:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T8 = F<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:22:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef S1 = G; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:23:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S2 = G<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:24:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S3 = G<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:25:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S4 = G<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:28:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S7 = G<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:29:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S8 = G<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef T1 = self::Class<dynamic>;
+typedef T2 = dynamic;
+typedef T3 = self::Class<dynamic>;
+typedef T4 = self::Class<dynamic>;
+typedef T5 = self::ConcreteClass;
+typedef T6 = self::Class<self::ConcreteClass>;
+typedef T7 = core::Object;
+typedef T8 = core::int;
+typedef S1 = self::G<self::Class<dynamic>>;
+typedef S2 = self::G<dynamic>;
+typedef S3 = self::G<self::Class<dynamic>>;
+typedef S4 = self::G<self::Class<dynamic>>;
+typedef S5 = self::G<self::ConcreteClass>;
+typedef S6 = self::G<self::Class<self::ConcreteClass>>;
+typedef S7 = self::G<core::Object>;
+typedef S8 = self::G<core::int>;
+typedef Typedef1 = <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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.transformed.expect
new file mode 100644
index 0000000..bc261f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_aliases.dart.weak.transformed.expect
@@ -0,0 +1,205 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:32: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:40: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
+//     ^^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:38: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:39: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T8 extends F<int>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:46: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S7 extends G<Object>, // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:47: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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     S8 extends G<int> // Error
+//                ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:13:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef T1 = F; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:14:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T2 = F<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:15:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T3 = F<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:16:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T4 = F<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:19:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T7 = F<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:20:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef T8 = F<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:22:14: Error: Inferred type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef S1 = G; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:23:14: Error: Type argument 'dynamic' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S2 = G<dynamic>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:24:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S3 = G<Class>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:25:14: Error: Type argument 'Class<dynamic>' 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S4 = G<Class<dynamic>>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:28:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S7 = G<Object>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.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_aliases.dart:29:14: 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_aliases.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef S8 = G<int>; // Error
+//              ^
+// pkg/front_end/testcases/general/bounds_type_aliases.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef T1 = self::Class<dynamic>;
+typedef T2 = dynamic;
+typedef T3 = self::Class<dynamic>;
+typedef T4 = self::Class<dynamic>;
+typedef T5 = self::ConcreteClass;
+typedef T6 = self::Class<self::ConcreteClass>;
+typedef T7 = core::Object;
+typedef T8 = core::int;
+typedef S1 = self::G<self::Class<dynamic>>;
+typedef S2 = self::G<dynamic>;
+typedef S3 = self::G<self::Class<dynamic>>;
+typedef S4 = self::G<self::Class<dynamic>>;
+typedef S5 = self::G<self::ConcreteClass>;
+typedef S6 = self::G<self::Class<self::ConcreteClass>>;
+typedef S7 = self::G<core::Object>;
+typedef S8 = self::G<core::int>;
+typedef Typedef1 = <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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart b/pkg/front_end/testcases/general/bounds_type_arguments.dart
new file mode 100644
index 0000000..47fd340
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart
@@ -0,0 +1,204 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+typedef H<X> = Class2;
+
+void staticMethod<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6, S7,
+    S8>() {}
+
+class Class1<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6, S7, S8> {
+  Class1();
+
+  factory Class1.fact() => new Class1();
+
+  factory Class1.redirect() = Class1;
+}
+
+class Class2 {
+  void instanceMethod<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6,
+      S7, S8>() {}
+}
+
+test() {
+  staticMethod<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >();
+
+  var tearOff = staticMethod;
+  tearOff<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >();
+
+  tearOff<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >;
+
+  new Class1<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >();
+
+  new Class1<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >.fact();
+
+  new Class1<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >.redirect();
+
+  new Class2().instanceMethod<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >();
+
+  dynamic d = staticMethod;
+  d<
+      F, // Ok
+      F<dynamic>, // Ok
+      F<Class>, // Ok
+      F<Class<dynamic>>, // Ok
+      F<ConcreteClass>, // Ok
+      F<Class<ConcreteClass>>, // Ok
+      F<Object>, // Error
+      F<int>, // Error
+      G, // Ok
+      G<dynamic>, // Ok
+      G<Class>, // Ok
+      G<Class<dynamic>>, // Ok
+      G<ConcreteClass>, // Ok
+      G<Class<ConcreteClass>>, // Ok
+      G<Object>, // Error
+      G<int> // Error
+      >();
+
+  new H<F>(); // Ok
+  new H<F<dynamic>>(); // Ok
+  new H<F<Class>>(); // Ok
+  new H<F<Class<dynamic>>>(); // Ok
+  new H<F<ConcreteClass>>(); // Ok
+  new H<F<Class<ConcreteClass>>>(); // Ok
+  new H<F<Object>>(); // Error
+  new H<F<int>>(); // Error
+  new H<G>(); // Ok
+  new H<G<dynamic>>(); // Ok
+  new H<G<Class>>(); // Ok
+  new H<G<Class<dynamic>>>(); // Ok
+  new H<G<ConcreteClass>>(); // Ok
+  new H<G<Class<ConcreteClass>>>(); // Ok
+  new H<G<Object>>(); // Error
+  new H<G<int>>(); // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_type_arguments.dart.textual_outline.expect
new file mode 100644
index 0000000..62264e3
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,25 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+typedef H<X> = Class2;
+void staticMethod<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6, S7,
+    S8>() {}
+
+class Class1<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6, S7, S8> {
+  Class1();
+  factory Class1.fact() => new Class1();
+  factory Class1.redirect() = Class1;
+}
+
+class Class2 {
+  void instanceMethod<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6,
+      S7, S8>() {}
+}
+
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_type_arguments.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..31c481b
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart.textual_outline_modelled.expect
@@ -0,0 +1,23 @@
+class Class<T> {}
+
+class Class1<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6, S7, S8> {
+  Class1();
+  factory Class1.fact() => new Class1();
+  factory Class1.redirect() = Class1;
+}
+
+class Class2 {
+  void instanceMethod<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6,
+      S7, S8>() {}
+}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+test() {}
+typedef F<X extends Class<X>> = X;
+typedef H<X> = Class2;
+void staticMethod<T1, T2, T3, T4, T5, T6, T7, T8, S1, S2, S3, S4, S5, S6, S7,
+    S8>() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.expect b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.expect
new file mode 100644
index 0000000..4d4b0ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.expect
@@ -0,0 +1,419 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_arguments.dart:39:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:40:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:47:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:48:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:59:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:60:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:67:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:68:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:78:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:79:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:86:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:87:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:97:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:98:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:105:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:106:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:116:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:117:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:124:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:125:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:135:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:136:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:143:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:144:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:154:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:155:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:162:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:163:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:174:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:175:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:182:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:183:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:192:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<F<Object>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:193:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<F<int>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:200:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<G<Object>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:201:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<G<int>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef H<unrelated X extends core::Object? = dynamic> = self::Class2;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  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%>
+    : super core::Object::•()
+    ;
+  static factory fact<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>
+    return new self::Class1::•<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>();
+  static factory redirect<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>
+    return new self::Class1::•<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>();
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  method instanceMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void {}
+}
+static method staticMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void {}
+static method test() → dynamic {
+  self::staticMethod<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  <T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void tearOff = #C2;
+  tearOff<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>(){() → void};
+  tearOff<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>;
+  new self::Class1::•<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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::Class1::fact<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class1::•<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class2::•().{self::Class2::instanceMethod}<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>(){() → void};
+  dynamic d = #C2;
+  d{dynamic}.call<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+}
+static method main() → dynamic {}
+static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic>() → self::Class2
+  return new self::Class2::•();
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::redirect
+  #C2 = static-tearoff self::staticMethod
+}
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..4d4b0ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.modular.expect
@@ -0,0 +1,419 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_arguments.dart:39:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:40:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:47:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:48:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:59:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:60:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:67:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:68:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:78:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:79:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:86:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:87:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:97:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:98:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:105:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:106:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:116:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:117:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:124:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:125:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:135:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:136:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:143:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:144:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:154:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:155:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:162:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:163:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:174:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:175:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:182:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:183:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:192:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<F<Object>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:193:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<F<int>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:200:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<G<Object>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:201:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<G<int>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef H<unrelated X extends core::Object? = dynamic> = self::Class2;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  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%>
+    : super core::Object::•()
+    ;
+  static factory fact<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>
+    return new self::Class1::•<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>();
+  static factory redirect<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>
+    return new self::Class1::•<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>();
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  method instanceMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void {}
+}
+static method staticMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void {}
+static method test() → dynamic {
+  self::staticMethod<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  <T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void tearOff = #C2;
+  tearOff<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>(){() → void};
+  tearOff<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>;
+  new self::Class1::•<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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::Class1::fact<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class1::•<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class2::•().{self::Class2::instanceMethod}<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>(){() → void};
+  dynamic d = #C2;
+  d{dynamic}.call<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+}
+static method main() → dynamic {}
+static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic>() → self::Class2
+  return new self::Class2::•();
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::redirect
+  #C2 = static-tearoff self::staticMethod
+}
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.outline.expect
new file mode 100644
index 0000000..a7a3717
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef H<unrelated X extends core::Object? = dynamic> = self::Class2;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class Class1<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::Class1::redirect]/*isLegacy*/;
+  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%>
+    ;
+  static factory fact<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>
+    ;
+  static factory redirect<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>
+    return new self::Class1::•<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>();
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    ;
+  method instanceMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void
+    ;
+}
+static method staticMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic>() → self::Class2
+  return new self::Class2::•();
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///bounds_type_arguments.dart:18:7 -> ConstructorTearOffConstant(Class1.redirect)
+Extra constant evaluation: evaluated: 4, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.transformed.expect
new file mode 100644
index 0000000..4d4b0ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,419 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_arguments.dart:39:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:40:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:47:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:48:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:59:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:60:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:67:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:68:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:78:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:79:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:86:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:87:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:97:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:98:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:105:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:106:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:116:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:117:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:124:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:125:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:135:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:136:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:143:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:144:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:154:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:155:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:162:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:163:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:174:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:175:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       F<int>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:182:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<Object>, // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:183:7: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       G<int> // Error
+//       ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:192:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<F<Object>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:193:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<F<int>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:200:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<G<Object>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.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_arguments.dart:201:9: 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_arguments.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new H<G<int>>(); // Error
+//         ^
+// pkg/front_end/testcases/general/bounds_type_arguments.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+typedef H<unrelated X extends core::Object? = dynamic> = self::Class2;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  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%>
+    : super core::Object::•()
+    ;
+  static factory fact<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>
+    return new self::Class1::•<self::Class1::fact::T1%, self::Class1::fact::T2%, self::Class1::fact::T3%, self::Class1::fact::T4%, self::Class1::fact::T5%, self::Class1::fact::T6%, self::Class1::fact::T7%, self::Class1::fact::T8%, self::Class1::fact::S1%, self::Class1::fact::S2%, self::Class1::fact::S3%, self::Class1::fact::S4%, self::Class1::fact::S5%, self::Class1::fact::S6%, self::Class1::fact::S7%, self::Class1::fact::S8%>();
+  static factory redirect<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → self::Class1<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>
+    return new self::Class1::•<self::Class1::redirect::T1%, self::Class1::redirect::T2%, self::Class1::redirect::T3%, self::Class1::redirect::T4%, self::Class1::redirect::T5%, self::Class1::redirect::T6%, self::Class1::redirect::T7%, self::Class1::redirect::T8%, self::Class1::redirect::S1%, self::Class1::redirect::S2%, self::Class1::redirect::S3%, self::Class1::redirect::S4%, self::Class1::redirect::S5%, self::Class1::redirect::S6%, self::Class1::redirect::S7%, self::Class1::redirect::S8%>();
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  method instanceMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void {}
+}
+static method staticMethod<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void {}
+static method test() → dynamic {
+  self::staticMethod<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  <T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic, T4 extends core::Object? = dynamic, T5 extends core::Object? = dynamic, T6 extends core::Object? = dynamic, T7 extends core::Object? = dynamic, T8 extends core::Object? = dynamic, S1 extends core::Object? = dynamic, S2 extends core::Object? = dynamic, S3 extends core::Object? = dynamic, S4 extends core::Object? = dynamic, S5 extends core::Object? = dynamic, S6 extends core::Object? = dynamic, S7 extends core::Object? = dynamic, S8 extends core::Object? = dynamic>() → void tearOff = #C2;
+  tearOff<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>(){() → void};
+  tearOff<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>;
+  new self::Class1::•<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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::Class1::fact<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class1::•<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class2::•().{self::Class2::instanceMethod}<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>(){() → void};
+  dynamic d = #C2;
+  d{dynamic}.call<self::Class<dynamic>, dynamic, self::Class<dynamic>, self::Class<dynamic>, self::ConcreteClass, self::Class<self::ConcreteClass>, core::Object, 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>>();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+  new self::Class2::•();
+}
+static method main() → dynamic {}
+static method _#H#new#tearOff<unrelated X extends core::Object? = dynamic>() → self::Class2
+  return new self::Class2::•();
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::redirect
+  #C2 = static-tearoff self::staticMethod
+}
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart b/pkg/front_end/testcases/general/bounds_type_literals.dart
new file mode 100644
index 0000000..2c4f20a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+class Class1 {}
+
+test() {
+  F; // Ok
+  F<dynamic>; // Ok
+  F<Class>; // Ok
+  F<Class<dynamic>>; // Ok
+  F<ConcreteClass>; // Ok
+  F<Class<ConcreteClass>>; // Ok
+  F<Object>; // Error
+  F<int>; // Error
+  G; // Ok
+  G<dynamic>; // Ok
+  G<Class>; // Ok
+  G<Class<dynamic>>; // Ok
+  G<ConcreteClass>; // Ok
+  G<Class<ConcreteClass>>; // Ok
+  G<Object>; // Error
+  G<int>; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_type_literals.dart.textual_outline.expect
new file mode 100644
index 0000000..d7e1cd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+class Class1 {}
+
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_type_literals.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..105a3bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+class Class<T> {}
+
+class Class1 {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+test() {}
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.expect b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.expect
new file mode 100644
index 0000000..1f414e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.expect
@@ -0,0 +1,100 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_literals.dart:22:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:23:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:30:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:31:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  #C1;
+  #C2;
+  #C1;
+  #C1;
+  #C3;
+  #C4;
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C7;
+  #C7;
+  #C9;
+  #C10;
+  #C11;
+  #C12;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Class<dynamic>*)
+  #C2 = TypeLiteralConstant(dynamic)
+  #C3 = TypeLiteralConstant(self::ConcreteClass*)
+  #C4 = TypeLiteralConstant(self::Class<self::ConcreteClass*>*)
+  #C5 = TypeLiteralConstant(core::Object*)
+  #C6 = TypeLiteralConstant(core::int*)
+  #C7 = TypeLiteralConstant(self::G<self::Class<dynamic>*>*)
+  #C8 = TypeLiteralConstant(self::G<dynamic>*)
+  #C9 = TypeLiteralConstant(self::G<self::ConcreteClass*>*)
+  #C10 = TypeLiteralConstant(self::G<self::Class<self::ConcreteClass*>*>*)
+  #C11 = TypeLiteralConstant(self::G<core::Object*>*)
+  #C12 = TypeLiteralConstant(self::G<core::int*>*)
+}
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..1f414e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.modular.expect
@@ -0,0 +1,100 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_literals.dart:22:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:23:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:30:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:31:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  #C1;
+  #C2;
+  #C1;
+  #C1;
+  #C3;
+  #C4;
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C7;
+  #C7;
+  #C9;
+  #C10;
+  #C11;
+  #C12;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Class<dynamic>*)
+  #C2 = TypeLiteralConstant(dynamic)
+  #C3 = TypeLiteralConstant(self::ConcreteClass*)
+  #C4 = TypeLiteralConstant(self::Class<self::ConcreteClass*>*)
+  #C5 = TypeLiteralConstant(core::Object*)
+  #C6 = TypeLiteralConstant(core::int*)
+  #C7 = TypeLiteralConstant(self::G<self::Class<dynamic>*>*)
+  #C8 = TypeLiteralConstant(self::G<dynamic>*)
+  #C9 = TypeLiteralConstant(self::G<self::ConcreteClass*>*)
+  #C10 = TypeLiteralConstant(self::G<self::Class<self::ConcreteClass*>*>*)
+  #C11 = TypeLiteralConstant(self::G<core::Object*>*)
+  #C12 = TypeLiteralConstant(self::G<core::int*>*)
+}
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.outline.expect
new file mode 100644
index 0000000..354780e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.transformed.expect
new file mode 100644
index 0000000..1f414e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_literals.dart.weak.transformed.expect
@@ -0,0 +1,100 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_type_literals.dart:22:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:23:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:30:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.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_literals.dart:31:3: 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_literals.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int>; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_type_literals.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  #C1;
+  #C2;
+  #C1;
+  #C1;
+  #C3;
+  #C4;
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C7;
+  #C7;
+  #C9;
+  #C10;
+  #C11;
+  #C12;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Class<dynamic>*)
+  #C2 = TypeLiteralConstant(dynamic)
+  #C3 = TypeLiteralConstant(self::ConcreteClass*)
+  #C4 = TypeLiteralConstant(self::Class<self::ConcreteClass*>*)
+  #C5 = TypeLiteralConstant(core::Object*)
+  #C6 = TypeLiteralConstant(core::int*)
+  #C7 = TypeLiteralConstant(self::G<self::Class<dynamic>*>*)
+  #C8 = TypeLiteralConstant(self::G<dynamic>*)
+  #C9 = TypeLiteralConstant(self::G<self::ConcreteClass*>*)
+  #C10 = TypeLiteralConstant(self::G<self::Class<self::ConcreteClass*>*>*)
+  #C11 = TypeLiteralConstant(self::G<core::Object*>*)
+  #C12 = TypeLiteralConstant(self::G<core::int*>*)
+}
diff --git a/pkg/front_end/testcases/general/bounds_type_parameters.dart b/pkg/front_end/testcases/general/bounds_type_parameters.dart
new file mode 100644
index 0000000..3a1e8eb
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart
@@ -0,0 +1,243 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+typedef Typedef1<
+        T1 extends F, // Error
+        T2 extends F<dynamic>, // Ok
+        T3 extends F<Class>, // Ok
+        T4 extends F<Class<dynamic>>, // Ok
+        T5 extends F<ConcreteClass>, // Ok
+        T6 extends F<Class<ConcreteClass>>, // Ok
+        T7 extends F<Object>, // Error
+        T8 extends F<int>, // Error
+        S1 extends G, // Error
+        S2 extends G<dynamic>, // Ok
+        S3 extends G<Class>, // Ok
+        S4 extends G<Class<dynamic>>, // Ok
+        S5 extends G<ConcreteClass>, // Ok
+        S6 extends G<Class<ConcreteClass>>, // Ok
+        S7 extends G<Object>, // Error
+        S8 extends G<int> // Error
+        >
+    = void Function();
+
+typedef Typedef2 = void Function<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    >();
+
+typedef void Typedef3<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    >();
+
+class Class1<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    > {}
+
+class Class2<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    > = Object with Class;
+
+mixin Mixin1<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    > {}
+
+// TODO(johnniwinther): Check/create this type as regular bounded i2b.
+enum Enum1<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Error
+    T4 extends F<Class<dynamic>>, // Error
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Error
+    S3 extends G<Class>, // Error
+    S4 extends G<Class<dynamic>>, // Error
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    > {
+  a<
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>>()
+}
+
+extension Extension<
+    T1 extends F, // Ok
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Ok
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    > on Class {}
+
+void method1<
+    T1 extends F, // Error
+    T2 extends F<dynamic>, // Ok
+    T3 extends F<Class>, // Ok
+    T4 extends F<Class<dynamic>>, // Ok
+    T5 extends F<ConcreteClass>, // Ok
+    T6 extends F<Class<ConcreteClass>>, // Ok
+    T7 extends F<Object>, // Error
+    T8 extends F<int>, // Error
+    S1 extends G, // Error
+    S2 extends G<dynamic>, // Ok
+    S3 extends G<Class>, // Ok
+    S4 extends G<Class<dynamic>>, // Ok
+    S5 extends G<ConcreteClass>, // Ok
+    S6 extends G<Class<ConcreteClass>>, // Ok
+    S7 extends G<Object>, // Error
+    S8 extends G<int> // Error
+    >() {}
+
+test() {
+  void local1<
+      T1 extends F, // Ok
+      T2 extends F<dynamic>, // Ok
+      T3 extends F<Class>, // Ok
+      T4 extends F<Class<dynamic>>, // Ok
+      T5 extends F<ConcreteClass>, // Ok
+      T6 extends F<Class<ConcreteClass>>, // Ok
+      T7 extends F<Object>, // Error
+      T8 extends F<int>, // Error
+      S1 extends G, // Ok
+      S2 extends G<dynamic>, // Ok
+      S3 extends G<Class>, // Ok
+      S4 extends G<Class<dynamic>>, // Ok
+      S5 extends G<ConcreteClass>, // Ok
+      S6 extends G<Class<ConcreteClass>>, // Ok
+      S7 extends G<Object>, // Error
+      S8 extends G<int> // Error
+      >() {}
+  void Function<
+      T1 extends F, // Ok
+      T2 extends F<dynamic>, // Ok
+      T3 extends F<Class>, // Ok
+      T4 extends F<Class<dynamic>>, // Ok
+      T5 extends F<ConcreteClass>, // Ok
+      T6 extends F<Class<ConcreteClass>>, // Ok
+      T7 extends F<Object>, // Error
+      T8 extends F<int>, // Error
+      S1 extends G, // Ok
+      S2 extends G<dynamic>, // Ok
+      S3 extends G<Class>, // Ok
+      S4 extends G<Class<dynamic>>, // Ok
+      S5 extends G<ConcreteClass>, // Ok
+      S6 extends G<Class<ConcreteClass>>, // Ok
+      S7 extends G<Object>, // Error
+      S8 extends G<int> // Error
+      >() local;
+}
+
+main() {}
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
new file mode 100644
index 0000000..7608f2d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline.expect
@@ -0,0 +1,187 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+typedef Typedef1<
+        T1 extends F,
+        T2 extends F<dynamic>,
+        T3 extends F<Class>,
+        T4 extends F<Class<dynamic>>,
+        T5 extends F<ConcreteClass>,
+        T6 extends F<Class<ConcreteClass>>,
+        T7 extends F<Object>,
+        T8 extends F<int>,
+        S1 extends G,
+        S2 extends G<dynamic>,
+        S3 extends G<Class>,
+        S4 extends G<Class<dynamic>>,
+        S5 extends G<ConcreteClass>,
+        S6 extends G<Class<ConcreteClass>>,
+        S7 extends G<Object>,
+        S8 extends G<int>>
+    = void Function();
+typedef Typedef2 = void Function<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>>();
+typedef void Typedef3<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>>();
+
+class Class1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> {}
+
+class Class2<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> = Object with Class;
+mixin Mixin1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> {}
+
+enum Enum1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> {
+  a<
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>>()
+}
+
+extension Extension<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> on Class {}
+
+void method1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<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
new file mode 100644
index 0000000..216f660
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.textual_outline_modelled.expect
@@ -0,0 +1,185 @@
+class Class<T> {}
+
+class Class1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> {}
+
+class Class2<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> = Object with Class;
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+enum Enum1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> {
+  a<
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      ConcreteClass,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>,
+      G<ConcreteClass>>()
+}
+
+extension Extension<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> on Class {}
+
+main() {}
+mixin Mixin1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>> {}
+test() {}
+typedef F<X extends Class<X>> = X;
+typedef Typedef1<
+        T1 extends F,
+        T2 extends F<dynamic>,
+        T3 extends F<Class>,
+        T4 extends F<Class<dynamic>>,
+        T5 extends F<ConcreteClass>,
+        T6 extends F<Class<ConcreteClass>>,
+        T7 extends F<Object>,
+        T8 extends F<int>,
+        S1 extends G,
+        S2 extends G<dynamic>,
+        S3 extends G<Class>,
+        S4 extends G<Class<dynamic>>,
+        S5 extends G<ConcreteClass>,
+        S6 extends G<Class<ConcreteClass>>,
+        S7 extends G<Object>,
+        S8 extends G<int>>
+    = void Function();
+typedef Typedef2 = void Function<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>>();
+typedef void Typedef3<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<int>>();
+void method1<
+    T1 extends F,
+    T2 extends F<dynamic>,
+    T3 extends F<Class>,
+    T4 extends F<Class<dynamic>>,
+    T5 extends F<ConcreteClass>,
+    T6 extends F<Class<ConcreteClass>>,
+    T7 extends F<Object>,
+    T8 extends F<int>,
+    S1 extends G,
+    S2 extends G<dynamic>,
+    S3 extends G<Class>,
+    S4 extends G<Class<dynamic>>,
+    S5 extends G<ConcreteClass>,
+    S6 extends G<Class<ConcreteClass>>,
+    S7 extends G<Object>,
+    S8 extends G<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
new file mode 100644
index 0000000..dbd7faa
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.expect
@@ -0,0 +1,634 @@
+library /*isNonNullableByDefault*/;
+//
+// 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.
+// Try providing type arguments to 'F' here.
+//         T1 extends F, // 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:22: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
+//         ^^
+// 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:34: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
+//     ^^
+// 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:42: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
+//     ^^
+// 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:53: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
+//     ^^
+// 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:61: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
+//     ^^
+// 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:72: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
+//     ^^
+// 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:80: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
+//     ^^
+// 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:91: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
+//     ^^
+// 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:99: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
+//     ^^
+// 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:110: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
+//     ^^
+// 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:118: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
+//     ^^
+// 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:130: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
+//     ^^
+// 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:138: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
+//     ^^
+// 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:186: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
+//     ^^
+// 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:194: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
+//     ^^
+// 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:20: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.
+//         T7 extends F<Object>, // 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:21: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
+//                    ^
+// 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:28: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.
+//         S7 extends G<Object>, // 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:29: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
+//                    ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:41: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
+//                ^
+// 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:48: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.
+//     S7 extends G<Object>, // 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:49: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:60: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
+//                ^
+// 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:67: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.
+//     S7 extends G<Object>, // 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:68: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:79: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
+//                ^
+// 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:86: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.
+//     S7 extends G<Object>, // 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:87: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:98: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
+//                ^
+// 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:105: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.
+//     S7 extends G<Object>, // 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:106: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:117: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
+//                ^
+// 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:124: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.
+//     S7 extends G<Object>, // 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:125: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:137: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
+//                ^
+// 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:144: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.
+//     S7 extends G<Object>, // 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:145: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:174: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
+//                ^
+// 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:181: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.
+//     S7 extends G<Object>, // 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 '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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:193: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
+//                ^
+// 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:200: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.
+//     S7 extends G<Object>, // 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:201: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
+//                ^
+// 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'.
+//  - '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.
+//     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'.
+//  - '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:212: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.
+//       T7 extends F<Object>, // 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:213: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
+//                  ^
+// 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:220: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.
+//       S7 extends G<Object>, // 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:221: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
+//                  ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       T7 extends F<Object>, // 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:231: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
+//                  ^
+// 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:238: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.
+//       S7 extends G<Object>, // 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:239: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
+//                  ^
+// 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>> {}
+//         ^
+//
+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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : 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>
+    : 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>
+    : 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 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 = #C4;
+  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>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "Enum1.${this.{core::_Enum::_name}{core::String}}";
+}
+extension Extension<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>> 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 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;
+}
+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}
+  #C4 = <self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_type_parameters.dart:
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
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
new file mode 100644
index 0000000..dbd7faa
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.modular.expect
@@ -0,0 +1,634 @@
+library /*isNonNullableByDefault*/;
+//
+// 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.
+// Try providing type arguments to 'F' here.
+//         T1 extends F, // 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:22: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
+//         ^^
+// 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:34: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
+//     ^^
+// 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:42: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
+//     ^^
+// 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:53: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
+//     ^^
+// 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:61: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
+//     ^^
+// 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:72: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
+//     ^^
+// 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:80: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
+//     ^^
+// 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:91: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
+//     ^^
+// 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:99: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
+//     ^^
+// 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:110: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
+//     ^^
+// 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:118: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
+//     ^^
+// 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:130: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
+//     ^^
+// 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:138: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
+//     ^^
+// 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:186: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
+//     ^^
+// 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:194: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
+//     ^^
+// 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:20: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.
+//         T7 extends F<Object>, // 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:21: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
+//                    ^
+// 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:28: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.
+//         S7 extends G<Object>, // 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:29: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
+//                    ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:41: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
+//                ^
+// 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:48: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.
+//     S7 extends G<Object>, // 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:49: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:60: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
+//                ^
+// 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:67: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.
+//     S7 extends G<Object>, // 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:68: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:79: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
+//                ^
+// 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:86: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.
+//     S7 extends G<Object>, // 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:87: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:98: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
+//                ^
+// 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:105: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.
+//     S7 extends G<Object>, // 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:106: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:117: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
+//                ^
+// 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:124: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.
+//     S7 extends G<Object>, // 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:125: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:137: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
+//                ^
+// 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:144: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.
+//     S7 extends G<Object>, // 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:145: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:174: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
+//                ^
+// 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:181: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.
+//     S7 extends G<Object>, // 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 '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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:193: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
+//                ^
+// 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:200: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.
+//     S7 extends G<Object>, // 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:201: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
+//                ^
+// 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'.
+//  - '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.
+//     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'.
+//  - '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:212: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.
+//       T7 extends F<Object>, // 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:213: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
+//                  ^
+// 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:220: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.
+//       S7 extends G<Object>, // 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:221: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
+//                  ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       T7 extends F<Object>, // 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:231: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
+//                  ^
+// 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:238: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.
+//       S7 extends G<Object>, // 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:239: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
+//                  ^
+// 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>> {}
+//         ^
+//
+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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : 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>
+    : 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>
+    : 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 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 = #C4;
+  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>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "Enum1.${this.{core::_Enum::_name}{core::String}}";
+}
+extension Extension<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>> 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 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;
+}
+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}
+  #C4 = <self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_type_parameters.dart:
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
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
new file mode 100644
index 0000000..ad2a952
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.outline.expect
@@ -0,0 +1,546 @@
+library /*isNonNullableByDefault*/;
+//
+// 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.
+// Try providing type arguments to 'F' here.
+//         T1 extends F, // 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:22: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
+//         ^^
+// 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:34: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
+//     ^^
+// 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:42: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
+//     ^^
+// 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:53: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
+//     ^^
+// 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:61: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
+//     ^^
+// 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:72: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
+//     ^^
+// 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:80: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
+//     ^^
+// 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:91: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
+//     ^^
+// 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:99: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
+//     ^^
+// 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:110: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
+//     ^^
+// 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:118: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
+//     ^^
+// 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:130: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
+//     ^^
+// 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:138: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
+//     ^^
+// 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:186: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
+//     ^^
+// 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:194: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
+//     ^^
+// 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:20: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.
+//         T7 extends F<Object>, // 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:21: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
+//                    ^
+// 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:28: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.
+//         S7 extends G<Object>, // 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:29: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
+//                    ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:41: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
+//                ^
+// 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:48: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.
+//     S7 extends G<Object>, // 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:49: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:60: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
+//                ^
+// 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:67: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.
+//     S7 extends G<Object>, // 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:68: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:79: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
+//                ^
+// 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:86: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.
+//     S7 extends G<Object>, // 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:87: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:98: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
+//                ^
+// 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:105: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.
+//     S7 extends G<Object>, // 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:106: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:117: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
+//                ^
+// 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:124: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.
+//     S7 extends G<Object>, // 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:125: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:137: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
+//                ^
+// 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:144: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.
+//     S7 extends G<Object>, // 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:145: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:174: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
+//                ^
+// 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:181: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.
+//     S7 extends G<Object>, // 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 '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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:193: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
+//                ^
+// 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:200: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.
+//     S7 extends G<Object>, // 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:201: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
+//                ^
+// 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'.
+//  - '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.
+//     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'.
+//  - '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
+//     ^
+//
+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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  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 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>
+    : 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 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<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>>[self::Enum1::a];
+  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>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "Enum1.${this.{core::_Enum::_name}{core::String}}";
+}
+extension Extension<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>> 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 test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///bounds_type_parameters.dart:129:6 -> ListConstant(const <Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>*>[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"})
+Extra constant evaluation: evaluated: 7, 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
new file mode 100644
index 0000000..9bede0a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_type_parameters.dart.weak.transformed.expect
@@ -0,0 +1,634 @@
+library /*isNonNullableByDefault*/;
+//
+// 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.
+// Try providing type arguments to 'F' here.
+//         T1 extends F, // 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:22: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
+//         ^^
+// 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:34: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
+//     ^^
+// 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:42: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
+//     ^^
+// 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:53: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
+//     ^^
+// 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:61: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
+//     ^^
+// 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:72: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
+//     ^^
+// 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:80: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
+//     ^^
+// 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:91: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
+//     ^^
+// 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:99: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
+//     ^^
+// 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:110: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
+//     ^^
+// 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:118: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
+//     ^^
+// 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:130: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
+//     ^^
+// 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:138: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
+//     ^^
+// 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:186: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
+//     ^^
+// 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:194: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
+//     ^^
+// 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:20: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.
+//         T7 extends F<Object>, // 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:21: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
+//                    ^
+// 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:28: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.
+//         S7 extends G<Object>, // 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:29: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
+//                    ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:41: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
+//                ^
+// 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:48: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.
+//     S7 extends G<Object>, // 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:49: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:60: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
+//                ^
+// 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:67: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.
+//     S7 extends G<Object>, // 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:68: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:79: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
+//                ^
+// 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:86: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.
+//     S7 extends G<Object>, // 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:87: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:98: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
+//                ^
+// 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:105: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.
+//     S7 extends G<Object>, // 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:106: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:117: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
+//                ^
+// 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:124: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.
+//     S7 extends G<Object>, // 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:125: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:137: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
+//                ^
+// 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:144: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.
+//     S7 extends G<Object>, // 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:145: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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:174: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
+//                ^
+// 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:181: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.
+//     S7 extends G<Object>, // 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 '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
+//                ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     T7 extends F<Object>, // 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:193: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
+//                ^
+// 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:200: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.
+//     S7 extends G<Object>, // 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:201: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
+//                ^
+// 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'.
+//  - '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.
+//     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'.
+//  - '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:212: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.
+//       T7 extends F<Object>, // 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:213: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
+//                  ^
+// 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:220: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.
+//       S7 extends G<Object>, // 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:221: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
+//                  ^
+// 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'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/bounds_type_parameters.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//       T7 extends F<Object>, // 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:231: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
+//                  ^
+// 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:238: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.
+//       S7 extends G<Object>, // 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:239: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
+//                  ^
+// 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>> {}
+//         ^
+//
+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;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : 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>
+    : 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>
+    : 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 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 = #C4;
+  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>
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "Enum1.${this.{core::_Enum::_name}{core::String}}";
+}
+extension Extension<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>> 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 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;
+}
+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}
+  #C4 = <self::Enum1<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bounds_type_parameters.dart:
+- Enum1. (from org-dartlang-testcase:///bounds_type_parameters.dart:129:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart b/pkg/front_end/testcases/general/bounds_variables.dart
new file mode 100644
index 0000000..244219f
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+test1() {
+  F local1a, local1b; // Ok
+  F<dynamic> local2a, local2b; // Ok
+  F<Class> local3a, local3b; // Ok
+  F<Class<dynamic>> local4a, local4b; // Ok
+  F<ConcreteClass> local5a, local5b; // Ok
+  F<Class<ConcreteClass>> local6a, local6b; // Ok
+  F<Object> local7a, local7b; // Error
+  F<int> local8a, local8b; // Error
+  G local1c, local1d; // Ok
+  G<dynamic> local2c, local2d; // Ok
+  G<Class> local3c, local3d; // Ok
+  G<Class<dynamic>> local4c, local4d; // Ok
+  G<ConcreteClass> local5c, local5d; // Ok
+  G<Class<ConcreteClass>> local6c, local6d; // Ok
+  G<Object> local7c, local8d; // Error
+  G<int> local8c, local7d; // Error
+}
+
+test2() {
+  void Function(F) local1a, local1b; // Ok
+  void Function(F<dynamic>) local2a, local2b; // Ok
+  void Function(F<Class>) local3a, local3b; // Ok
+  void Function(F<Class<dynamic>>) local4a, local4b; // Ok
+  void Function(F<ConcreteClass>) local5a, local5b; // Ok
+  void Function(F<Class<ConcreteClass>>) local6a, local6b; // Ok
+  void Function(F<Object>) local7a, local7b; // Error
+  void Function(F<int>) local8a, local8b; // Error
+  void Function(G) local1c, local1d; // Ok
+  void Function(G<dynamic>) local2c, local2d; // Ok
+  void Function(G<Class>) local3c, local3d; // Ok
+  void Function(G<Class<dynamic>>) local4c, local4d; // Ok
+  void Function(G<ConcreteClass>) local5c, local5d; // Ok
+  void Function(G<Class<ConcreteClass>>) local6c, local6d; // Ok
+  void Function(G<Object>) local7c, local8d; // Error
+  void Function(G<int>) local8c, local7d; // Error
+}
+
+test3() {
+  void Function(F f) local1a, local1b; // Ok
+  void Function(F<dynamic> f) local2a, local2b; // Ok
+  void Function(F<Class> f) local3a, local3b; // Ok
+  void Function(F<Class<dynamic>> f) local4a, local4b; // Ok
+  void Function(F<ConcreteClass> f) local5a, local5b; // Ok
+  void Function(F<Class<ConcreteClass>> f) local6a, local6b; // Ok
+  void Function(F<Object> f) local7a, local7b; // Error
+  void Function(F<int> f) local8a, local8b; // Error
+  void Function(G g) local1c, local1d; // Ok
+  void Function(G<dynamic> g) local2c, local2d; // Ok
+  void Function(G<Class> g) local3c, local3d; // Ok
+  void Function(G<Class<dynamic>> g) local4c, local4d; // Ok
+  void Function(G<ConcreteClass> g) local5c, local5d; // Ok
+  void Function(G<Class<ConcreteClass>> g) local6c, local6d; // Ok
+  void Function(G<Object> g) local7c, local8d; // Error
+  void Function(G<int> g) local8c, local7d; // Error
+}
+
+test4() {
+  void Function(void Function(F)) local1a, local1b; // Ok
+  void Function(void Function(F<dynamic>)) local2a, local2b; // Ok
+  void Function(void Function(F<Class>)) local3a, local3b; // Ok
+  void Function(void Function(F<Class<dynamic>>)) local4a, local4b; // Ok
+  void Function(void Function(F<ConcreteClass>)) local5a, local5b; // Ok
+  void Function(void Function(F<Class<ConcreteClass>>)) local6a, local6b; // Ok
+  void Function(void Function(F<Object>)) local7a, local7b; // Error
+  void Function(void Function(F<int>)) local8a, local8b; // Error
+  void Function(void Function(G)) local1c, local1d; // Ok
+  void Function(void Function(G<dynamic>)) local2c, local2d; // Ok
+  void Function(void Function(G<Class>)) local3c, local3d; // Ok
+  void Function(void Function(G<Class<dynamic>>)) local4c, local4d; // Ok
+  void Function(void Function(G<ConcreteClass>)) local5c, local5d; // Ok
+  void Function(void Function(G<Class<ConcreteClass>>)) local6c, local6d; // Ok
+  void Function(void Function(G<Object>)) local7c, local8d; // Error
+  void Function(void Function(G<int>)) local8c, local7d; // Error
+}
+
+test5() {
+  void Function(void Function(F f) f) local1a, local1b; // Ok
+  void Function(void Function(F<dynamic> f) f) local2a, local2b; // Ok
+  void Function(void Function(F<Class> f) f) local3a, local3b; // Ok
+  void Function(void Function(F<Class<dynamic>> f) f) local4a, local4b; // Ok
+  void Function(void Function(F<ConcreteClass> f) f) local5a, local5b; // Ok
+  void Function(void Function(F<Class<ConcreteClass>> f) f) local6a,
+      local6b; // Ok
+  void Function(void Function(F<Object> f) f) local7a, local7b; // Error
+  void Function(void Function(F<int> f) f) local8a, local8b; // Error
+  void Function(void Function(G g) g) local1c, local1d; // Ok
+  void Function(void Function(G<dynamic> g) g) local2c, local2d; // Ok
+  void Function(void Function(G<Class> g) g) local3c, local3d; // Ok
+  void Function(void Function(G<Class<dynamic>> g) g) local4c, local4d; // Ok
+  void Function(void Function(G<ConcreteClass> g) g) local5c, local5d; // Ok
+  void Function(void Function(G<Class<ConcreteClass>> g) g) local6c,
+      local6d; // Ok
+  void Function(void Function(G<Object> g) g) local7c, local8d; // Error
+  void Function(void Function(G<int> g) g) local8c, local7d; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart.textual_outline.expect b/pkg/front_end/testcases/general/bounds_variables.dart.textual_outline.expect
new file mode 100644
index 0000000..27ec92e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+typedef F<X extends Class<X>> = X;
+
+class G<X extends Class<X>> {}
+
+test1() {}
+test2() {}
+test3() {}
+test4() {}
+test5() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/bounds_variables.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..61c13bb
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+class Class<T> {}
+
+class ConcreteClass implements Class<ConcreteClass> {}
+
+class G<X extends Class<X>> {}
+
+main() {}
+test1() {}
+test2() {}
+test3() {}
+test4() {}
+test5() {}
+typedef F<X extends Class<X>> = X;
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart.weak.expect b/pkg/front_end/testcases/general/bounds_variables.dart.weak.expect
new file mode 100644
index 0000000..e0d7046
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart.weak.expect
@@ -0,0 +1,384 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_variables.dart:20:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> local7a, local7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:21:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> local8a, local8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:28:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> local7c, local8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:29:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> local8c, local7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:39: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<Object>) local7a, local7b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:40: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<int>) local8a, local8b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:47:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<Object>) local7c, local8d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:48:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<int>) local8c, local7d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:58: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<Object> f) local7a, local7b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:59: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<int> f) local8a, local8b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:66:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<Object> g) local7c, local8d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:67:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<int> g) local8c, local7d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:77:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<Object>)) local7a, local7b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:78:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<int>)) local8a, local8b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:85:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<Object>)) local7c, local8d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:86:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<int>)) local8c, local7d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:97:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<Object> f) f) local7a, local7b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:98:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<int> f) f) local8a, local8b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:106:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<Object> g) g) local7c, local8d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:107:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<int> g) g) local8c, local7d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method test1() → dynamic {
+  self::Class<dynamic> local1a;
+  self::Class<dynamic> local1b;
+  dynamic local2a;
+  dynamic local2b;
+  self::Class<dynamic> local3a;
+  self::Class<dynamic> local3b;
+  self::Class<dynamic> local4a;
+  self::Class<dynamic> local4b;
+  self::ConcreteClass local5a;
+  self::ConcreteClass local5b;
+  self::Class<self::ConcreteClass> local6a;
+  self::Class<self::ConcreteClass> local6b;
+  core::Object local7a;
+  core::Object local7b;
+  core::int local8a;
+  core::int local8b;
+  self::G<self::Class<dynamic>> local1c;
+  self::G<self::Class<dynamic>> local1d;
+  self::G<dynamic> local2c;
+  self::G<dynamic> local2d;
+  self::G<self::Class<dynamic>> local3c;
+  self::G<self::Class<dynamic>> local3d;
+  self::G<self::Class<dynamic>> local4c;
+  self::G<self::Class<dynamic>> local4d;
+  self::G<self::ConcreteClass> local5c;
+  self::G<self::ConcreteClass> local5d;
+  self::G<self::Class<self::ConcreteClass>> local6c;
+  self::G<self::Class<self::ConcreteClass>> local6d;
+  self::G<core::Object> local7c;
+  self::G<core::Object> local8d;
+  self::G<core::int> local8c;
+  self::G<core::int> local7d;
+}
+static method test2() → dynamic {
+  (self::Class<dynamic>) → void local1a;
+  (self::Class<dynamic>) → void local1b;
+  (dynamic) → void local2a;
+  (dynamic) → void local2b;
+  (self::Class<dynamic>) → void local3a;
+  (self::Class<dynamic>) → void local3b;
+  (self::Class<dynamic>) → void local4a;
+  (self::Class<dynamic>) → void local4b;
+  (self::ConcreteClass) → void local5a;
+  (self::ConcreteClass) → void local5b;
+  (self::Class<self::ConcreteClass>) → void local6a;
+  (self::Class<self::ConcreteClass>) → void local6b;
+  (core::Object) → void local7a;
+  (core::Object) → void local7b;
+  (core::int) → void local8a;
+  (core::int) → void local8b;
+  (self::G<self::Class<dynamic>>) → void local1c;
+  (self::G<self::Class<dynamic>>) → void local1d;
+  (self::G<dynamic>) → void local2c;
+  (self::G<dynamic>) → void local2d;
+  (self::G<self::Class<dynamic>>) → void local3c;
+  (self::G<self::Class<dynamic>>) → void local3d;
+  (self::G<self::Class<dynamic>>) → void local4c;
+  (self::G<self::Class<dynamic>>) → void local4d;
+  (self::G<self::ConcreteClass>) → void local5c;
+  (self::G<self::ConcreteClass>) → void local5d;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6c;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6d;
+  (self::G<core::Object>) → void local7c;
+  (self::G<core::Object>) → void local8d;
+  (self::G<core::int>) → void local8c;
+  (self::G<core::int>) → void local7d;
+}
+static method test3() → dynamic {
+  (self::Class<dynamic>) → void local1a;
+  (self::Class<dynamic>) → void local1b;
+  (dynamic) → void local2a;
+  (dynamic) → void local2b;
+  (self::Class<dynamic>) → void local3a;
+  (self::Class<dynamic>) → void local3b;
+  (self::Class<dynamic>) → void local4a;
+  (self::Class<dynamic>) → void local4b;
+  (self::ConcreteClass) → void local5a;
+  (self::ConcreteClass) → void local5b;
+  (self::Class<self::ConcreteClass>) → void local6a;
+  (self::Class<self::ConcreteClass>) → void local6b;
+  (core::Object) → void local7a;
+  (core::Object) → void local7b;
+  (core::int) → void local8a;
+  (core::int) → void local8b;
+  (self::G<self::Class<dynamic>>) → void local1c;
+  (self::G<self::Class<dynamic>>) → void local1d;
+  (self::G<dynamic>) → void local2c;
+  (self::G<dynamic>) → void local2d;
+  (self::G<self::Class<dynamic>>) → void local3c;
+  (self::G<self::Class<dynamic>>) → void local3d;
+  (self::G<self::Class<dynamic>>) → void local4c;
+  (self::G<self::Class<dynamic>>) → void local4d;
+  (self::G<self::ConcreteClass>) → void local5c;
+  (self::G<self::ConcreteClass>) → void local5d;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6c;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6d;
+  (self::G<core::Object>) → void local7c;
+  (self::G<core::Object>) → void local8d;
+  (self::G<core::int>) → void local8c;
+  (self::G<core::int>) → void local7d;
+}
+static method test4() → dynamic {
+  ((self::Class<dynamic>) → void) → void local1a;
+  ((self::Class<dynamic>) → void) → void local1b;
+  ((dynamic) → void) → void local2a;
+  ((dynamic) → void) → void local2b;
+  ((self::Class<dynamic>) → void) → void local3a;
+  ((self::Class<dynamic>) → void) → void local3b;
+  ((self::Class<dynamic>) → void) → void local4a;
+  ((self::Class<dynamic>) → void) → void local4b;
+  ((self::ConcreteClass) → void) → void local5a;
+  ((self::ConcreteClass) → void) → void local5b;
+  ((self::Class<self::ConcreteClass>) → void) → void local6a;
+  ((self::Class<self::ConcreteClass>) → void) → void local6b;
+  ((core::Object) → void) → void local7a;
+  ((core::Object) → void) → void local7b;
+  ((core::int) → void) → void local8a;
+  ((core::int) → void) → void local8b;
+  ((self::G<self::Class<dynamic>>) → void) → void local1c;
+  ((self::G<self::Class<dynamic>>) → void) → void local1d;
+  ((self::G<dynamic>) → void) → void local2c;
+  ((self::G<dynamic>) → void) → void local2d;
+  ((self::G<self::Class<dynamic>>) → void) → void local3c;
+  ((self::G<self::Class<dynamic>>) → void) → void local3d;
+  ((self::G<self::Class<dynamic>>) → void) → void local4c;
+  ((self::G<self::Class<dynamic>>) → void) → void local4d;
+  ((self::G<self::ConcreteClass>) → void) → void local5c;
+  ((self::G<self::ConcreteClass>) → void) → void local5d;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6c;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6d;
+  ((self::G<core::Object>) → void) → void local7c;
+  ((self::G<core::Object>) → void) → void local8d;
+  ((self::G<core::int>) → void) → void local8c;
+  ((self::G<core::int>) → void) → void local7d;
+}
+static method test5() → dynamic {
+  ((self::Class<dynamic>) → void) → void local1a;
+  ((self::Class<dynamic>) → void) → void local1b;
+  ((dynamic) → void) → void local2a;
+  ((dynamic) → void) → void local2b;
+  ((self::Class<dynamic>) → void) → void local3a;
+  ((self::Class<dynamic>) → void) → void local3b;
+  ((self::Class<dynamic>) → void) → void local4a;
+  ((self::Class<dynamic>) → void) → void local4b;
+  ((self::ConcreteClass) → void) → void local5a;
+  ((self::ConcreteClass) → void) → void local5b;
+  ((self::Class<self::ConcreteClass>) → void) → void local6a;
+  ((self::Class<self::ConcreteClass>) → void) → void local6b;
+  ((core::Object) → void) → void local7a;
+  ((core::Object) → void) → void local7b;
+  ((core::int) → void) → void local8a;
+  ((core::int) → void) → void local8b;
+  ((self::G<self::Class<dynamic>>) → void) → void local1c;
+  ((self::G<self::Class<dynamic>>) → void) → void local1d;
+  ((self::G<dynamic>) → void) → void local2c;
+  ((self::G<dynamic>) → void) → void local2d;
+  ((self::G<self::Class<dynamic>>) → void) → void local3c;
+  ((self::G<self::Class<dynamic>>) → void) → void local3d;
+  ((self::G<self::Class<dynamic>>) → void) → void local4c;
+  ((self::G<self::Class<dynamic>>) → void) → void local4d;
+  ((self::G<self::ConcreteClass>) → void) → void local5c;
+  ((self::G<self::ConcreteClass>) → void) → void local5d;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6c;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6d;
+  ((self::G<core::Object>) → void) → void local7c;
+  ((self::G<core::Object>) → void) → void local8d;
+  ((self::G<core::int>) → void) → void local8c;
+  ((self::G<core::int>) → void) → void local7d;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_variables.dart.weak.modular.expect
new file mode 100644
index 0000000..e0d7046
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart.weak.modular.expect
@@ -0,0 +1,384 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_variables.dart:20:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> local7a, local7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:21:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> local8a, local8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:28:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> local7c, local8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:29:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> local8c, local7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:39: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<Object>) local7a, local7b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:40: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<int>) local8a, local8b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:47:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<Object>) local7c, local8d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:48:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<int>) local8c, local7d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:58: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<Object> f) local7a, local7b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:59: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<int> f) local8a, local8b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:66:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<Object> g) local7c, local8d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:67:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<int> g) local8c, local7d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:77:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<Object>)) local7a, local7b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:78:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<int>)) local8a, local8b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:85:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<Object>)) local7c, local8d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:86:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<int>)) local8c, local7d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:97:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<Object> f) f) local7a, local7b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:98:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<int> f) f) local8a, local8b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:106:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<Object> g) g) local7c, local8d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:107:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<int> g) g) local8c, local7d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method test1() → dynamic {
+  self::Class<dynamic> local1a;
+  self::Class<dynamic> local1b;
+  dynamic local2a;
+  dynamic local2b;
+  self::Class<dynamic> local3a;
+  self::Class<dynamic> local3b;
+  self::Class<dynamic> local4a;
+  self::Class<dynamic> local4b;
+  self::ConcreteClass local5a;
+  self::ConcreteClass local5b;
+  self::Class<self::ConcreteClass> local6a;
+  self::Class<self::ConcreteClass> local6b;
+  core::Object local7a;
+  core::Object local7b;
+  core::int local8a;
+  core::int local8b;
+  self::G<self::Class<dynamic>> local1c;
+  self::G<self::Class<dynamic>> local1d;
+  self::G<dynamic> local2c;
+  self::G<dynamic> local2d;
+  self::G<self::Class<dynamic>> local3c;
+  self::G<self::Class<dynamic>> local3d;
+  self::G<self::Class<dynamic>> local4c;
+  self::G<self::Class<dynamic>> local4d;
+  self::G<self::ConcreteClass> local5c;
+  self::G<self::ConcreteClass> local5d;
+  self::G<self::Class<self::ConcreteClass>> local6c;
+  self::G<self::Class<self::ConcreteClass>> local6d;
+  self::G<core::Object> local7c;
+  self::G<core::Object> local8d;
+  self::G<core::int> local8c;
+  self::G<core::int> local7d;
+}
+static method test2() → dynamic {
+  (self::Class<dynamic>) → void local1a;
+  (self::Class<dynamic>) → void local1b;
+  (dynamic) → void local2a;
+  (dynamic) → void local2b;
+  (self::Class<dynamic>) → void local3a;
+  (self::Class<dynamic>) → void local3b;
+  (self::Class<dynamic>) → void local4a;
+  (self::Class<dynamic>) → void local4b;
+  (self::ConcreteClass) → void local5a;
+  (self::ConcreteClass) → void local5b;
+  (self::Class<self::ConcreteClass>) → void local6a;
+  (self::Class<self::ConcreteClass>) → void local6b;
+  (core::Object) → void local7a;
+  (core::Object) → void local7b;
+  (core::int) → void local8a;
+  (core::int) → void local8b;
+  (self::G<self::Class<dynamic>>) → void local1c;
+  (self::G<self::Class<dynamic>>) → void local1d;
+  (self::G<dynamic>) → void local2c;
+  (self::G<dynamic>) → void local2d;
+  (self::G<self::Class<dynamic>>) → void local3c;
+  (self::G<self::Class<dynamic>>) → void local3d;
+  (self::G<self::Class<dynamic>>) → void local4c;
+  (self::G<self::Class<dynamic>>) → void local4d;
+  (self::G<self::ConcreteClass>) → void local5c;
+  (self::G<self::ConcreteClass>) → void local5d;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6c;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6d;
+  (self::G<core::Object>) → void local7c;
+  (self::G<core::Object>) → void local8d;
+  (self::G<core::int>) → void local8c;
+  (self::G<core::int>) → void local7d;
+}
+static method test3() → dynamic {
+  (self::Class<dynamic>) → void local1a;
+  (self::Class<dynamic>) → void local1b;
+  (dynamic) → void local2a;
+  (dynamic) → void local2b;
+  (self::Class<dynamic>) → void local3a;
+  (self::Class<dynamic>) → void local3b;
+  (self::Class<dynamic>) → void local4a;
+  (self::Class<dynamic>) → void local4b;
+  (self::ConcreteClass) → void local5a;
+  (self::ConcreteClass) → void local5b;
+  (self::Class<self::ConcreteClass>) → void local6a;
+  (self::Class<self::ConcreteClass>) → void local6b;
+  (core::Object) → void local7a;
+  (core::Object) → void local7b;
+  (core::int) → void local8a;
+  (core::int) → void local8b;
+  (self::G<self::Class<dynamic>>) → void local1c;
+  (self::G<self::Class<dynamic>>) → void local1d;
+  (self::G<dynamic>) → void local2c;
+  (self::G<dynamic>) → void local2d;
+  (self::G<self::Class<dynamic>>) → void local3c;
+  (self::G<self::Class<dynamic>>) → void local3d;
+  (self::G<self::Class<dynamic>>) → void local4c;
+  (self::G<self::Class<dynamic>>) → void local4d;
+  (self::G<self::ConcreteClass>) → void local5c;
+  (self::G<self::ConcreteClass>) → void local5d;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6c;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6d;
+  (self::G<core::Object>) → void local7c;
+  (self::G<core::Object>) → void local8d;
+  (self::G<core::int>) → void local8c;
+  (self::G<core::int>) → void local7d;
+}
+static method test4() → dynamic {
+  ((self::Class<dynamic>) → void) → void local1a;
+  ((self::Class<dynamic>) → void) → void local1b;
+  ((dynamic) → void) → void local2a;
+  ((dynamic) → void) → void local2b;
+  ((self::Class<dynamic>) → void) → void local3a;
+  ((self::Class<dynamic>) → void) → void local3b;
+  ((self::Class<dynamic>) → void) → void local4a;
+  ((self::Class<dynamic>) → void) → void local4b;
+  ((self::ConcreteClass) → void) → void local5a;
+  ((self::ConcreteClass) → void) → void local5b;
+  ((self::Class<self::ConcreteClass>) → void) → void local6a;
+  ((self::Class<self::ConcreteClass>) → void) → void local6b;
+  ((core::Object) → void) → void local7a;
+  ((core::Object) → void) → void local7b;
+  ((core::int) → void) → void local8a;
+  ((core::int) → void) → void local8b;
+  ((self::G<self::Class<dynamic>>) → void) → void local1c;
+  ((self::G<self::Class<dynamic>>) → void) → void local1d;
+  ((self::G<dynamic>) → void) → void local2c;
+  ((self::G<dynamic>) → void) → void local2d;
+  ((self::G<self::Class<dynamic>>) → void) → void local3c;
+  ((self::G<self::Class<dynamic>>) → void) → void local3d;
+  ((self::G<self::Class<dynamic>>) → void) → void local4c;
+  ((self::G<self::Class<dynamic>>) → void) → void local4d;
+  ((self::G<self::ConcreteClass>) → void) → void local5c;
+  ((self::G<self::ConcreteClass>) → void) → void local5d;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6c;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6d;
+  ((self::G<core::Object>) → void) → void local7c;
+  ((self::G<core::Object>) → void) → void local8d;
+  ((self::G<core::int>) → void) → void local8c;
+  ((self::G<core::int>) → void) → void local7d;
+}
+static method test5() → dynamic {
+  ((self::Class<dynamic>) → void) → void local1a;
+  ((self::Class<dynamic>) → void) → void local1b;
+  ((dynamic) → void) → void local2a;
+  ((dynamic) → void) → void local2b;
+  ((self::Class<dynamic>) → void) → void local3a;
+  ((self::Class<dynamic>) → void) → void local3b;
+  ((self::Class<dynamic>) → void) → void local4a;
+  ((self::Class<dynamic>) → void) → void local4b;
+  ((self::ConcreteClass) → void) → void local5a;
+  ((self::ConcreteClass) → void) → void local5b;
+  ((self::Class<self::ConcreteClass>) → void) → void local6a;
+  ((self::Class<self::ConcreteClass>) → void) → void local6b;
+  ((core::Object) → void) → void local7a;
+  ((core::Object) → void) → void local7b;
+  ((core::int) → void) → void local8a;
+  ((core::int) → void) → void local8b;
+  ((self::G<self::Class<dynamic>>) → void) → void local1c;
+  ((self::G<self::Class<dynamic>>) → void) → void local1d;
+  ((self::G<dynamic>) → void) → void local2c;
+  ((self::G<dynamic>) → void) → void local2d;
+  ((self::G<self::Class<dynamic>>) → void) → void local3c;
+  ((self::G<self::Class<dynamic>>) → void) → void local3d;
+  ((self::G<self::Class<dynamic>>) → void) → void local4c;
+  ((self::G<self::Class<dynamic>>) → void) → void local4d;
+  ((self::G<self::ConcreteClass>) → void) → void local5c;
+  ((self::G<self::ConcreteClass>) → void) → void local5d;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6c;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6d;
+  ((self::G<core::Object>) → void) → void local7c;
+  ((self::G<core::Object>) → void) → void local8d;
+  ((self::G<core::int>) → void) → void local8c;
+  ((self::G<core::int>) → void) → void local7d;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart.weak.outline.expect b/pkg/front_end/testcases/general/bounds_variables.dart.weak.outline.expect
new file mode 100644
index 0000000..786cea6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart.weak.outline.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    ;
+}
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method test3() → dynamic
+  ;
+static method test4() → dynamic
+  ;
+static method test5() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_variables.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bounds_variables.dart.weak.transformed.expect
new file mode 100644
index 0000000..e0d7046
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_variables.dart.weak.transformed.expect
@@ -0,0 +1,384 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_variables.dart:20:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<Object> local7a, local7b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:21:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<int> local8a, local8b; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:28:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<Object> local7c, local8d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:29:3: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   G<int> local8c, local7d; // Error
+//   ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:39: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<Object>) local7a, local7b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:40: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<int>) local8a, local8b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:47:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<Object>) local7c, local8d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:48:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<int>) local8c, local7d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:58: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<Object> f) local7a, local7b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:59: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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(F<int> f) local8a, local8b; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:66:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<Object> g) local7c, local8d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:67:17: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(G<int> g) local8c, local7d; // Error
+//                 ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:77:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<Object>)) local7a, local7b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:78:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<int>)) local8a, local8b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:85:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<Object>)) local7c, local8d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:86:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<int>)) local8c, local7d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:97:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<Object> f) f) local7a, local7b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:98:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(F<int> f) f) local8a, local8b; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:106:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<Object> g) g) local7c, local8d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.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_variables.dart:107:31: 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_variables.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void Function(void Function(G<int> g) g) local8c, local7d; // Error
+//                               ^
+// pkg/front_end/testcases/general/bounds_variables.dart:11:9: Context: This is the type variable whose bound isn't conformed to.
+// class G<X extends Class<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::Class<X> = self::Class<dynamic>> = X;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Class<self::ConcreteClass> {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+class G<X extends self::Class<self::G::X> = self::Class<dynamic>> extends core::Object {
+  synthetic constructor •() → self::G<self::G::X>
+    : super core::Object::•()
+    ;
+}
+static method test1() → dynamic {
+  self::Class<dynamic> local1a;
+  self::Class<dynamic> local1b;
+  dynamic local2a;
+  dynamic local2b;
+  self::Class<dynamic> local3a;
+  self::Class<dynamic> local3b;
+  self::Class<dynamic> local4a;
+  self::Class<dynamic> local4b;
+  self::ConcreteClass local5a;
+  self::ConcreteClass local5b;
+  self::Class<self::ConcreteClass> local6a;
+  self::Class<self::ConcreteClass> local6b;
+  core::Object local7a;
+  core::Object local7b;
+  core::int local8a;
+  core::int local8b;
+  self::G<self::Class<dynamic>> local1c;
+  self::G<self::Class<dynamic>> local1d;
+  self::G<dynamic> local2c;
+  self::G<dynamic> local2d;
+  self::G<self::Class<dynamic>> local3c;
+  self::G<self::Class<dynamic>> local3d;
+  self::G<self::Class<dynamic>> local4c;
+  self::G<self::Class<dynamic>> local4d;
+  self::G<self::ConcreteClass> local5c;
+  self::G<self::ConcreteClass> local5d;
+  self::G<self::Class<self::ConcreteClass>> local6c;
+  self::G<self::Class<self::ConcreteClass>> local6d;
+  self::G<core::Object> local7c;
+  self::G<core::Object> local8d;
+  self::G<core::int> local8c;
+  self::G<core::int> local7d;
+}
+static method test2() → dynamic {
+  (self::Class<dynamic>) → void local1a;
+  (self::Class<dynamic>) → void local1b;
+  (dynamic) → void local2a;
+  (dynamic) → void local2b;
+  (self::Class<dynamic>) → void local3a;
+  (self::Class<dynamic>) → void local3b;
+  (self::Class<dynamic>) → void local4a;
+  (self::Class<dynamic>) → void local4b;
+  (self::ConcreteClass) → void local5a;
+  (self::ConcreteClass) → void local5b;
+  (self::Class<self::ConcreteClass>) → void local6a;
+  (self::Class<self::ConcreteClass>) → void local6b;
+  (core::Object) → void local7a;
+  (core::Object) → void local7b;
+  (core::int) → void local8a;
+  (core::int) → void local8b;
+  (self::G<self::Class<dynamic>>) → void local1c;
+  (self::G<self::Class<dynamic>>) → void local1d;
+  (self::G<dynamic>) → void local2c;
+  (self::G<dynamic>) → void local2d;
+  (self::G<self::Class<dynamic>>) → void local3c;
+  (self::G<self::Class<dynamic>>) → void local3d;
+  (self::G<self::Class<dynamic>>) → void local4c;
+  (self::G<self::Class<dynamic>>) → void local4d;
+  (self::G<self::ConcreteClass>) → void local5c;
+  (self::G<self::ConcreteClass>) → void local5d;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6c;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6d;
+  (self::G<core::Object>) → void local7c;
+  (self::G<core::Object>) → void local8d;
+  (self::G<core::int>) → void local8c;
+  (self::G<core::int>) → void local7d;
+}
+static method test3() → dynamic {
+  (self::Class<dynamic>) → void local1a;
+  (self::Class<dynamic>) → void local1b;
+  (dynamic) → void local2a;
+  (dynamic) → void local2b;
+  (self::Class<dynamic>) → void local3a;
+  (self::Class<dynamic>) → void local3b;
+  (self::Class<dynamic>) → void local4a;
+  (self::Class<dynamic>) → void local4b;
+  (self::ConcreteClass) → void local5a;
+  (self::ConcreteClass) → void local5b;
+  (self::Class<self::ConcreteClass>) → void local6a;
+  (self::Class<self::ConcreteClass>) → void local6b;
+  (core::Object) → void local7a;
+  (core::Object) → void local7b;
+  (core::int) → void local8a;
+  (core::int) → void local8b;
+  (self::G<self::Class<dynamic>>) → void local1c;
+  (self::G<self::Class<dynamic>>) → void local1d;
+  (self::G<dynamic>) → void local2c;
+  (self::G<dynamic>) → void local2d;
+  (self::G<self::Class<dynamic>>) → void local3c;
+  (self::G<self::Class<dynamic>>) → void local3d;
+  (self::G<self::Class<dynamic>>) → void local4c;
+  (self::G<self::Class<dynamic>>) → void local4d;
+  (self::G<self::ConcreteClass>) → void local5c;
+  (self::G<self::ConcreteClass>) → void local5d;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6c;
+  (self::G<self::Class<self::ConcreteClass>>) → void local6d;
+  (self::G<core::Object>) → void local7c;
+  (self::G<core::Object>) → void local8d;
+  (self::G<core::int>) → void local8c;
+  (self::G<core::int>) → void local7d;
+}
+static method test4() → dynamic {
+  ((self::Class<dynamic>) → void) → void local1a;
+  ((self::Class<dynamic>) → void) → void local1b;
+  ((dynamic) → void) → void local2a;
+  ((dynamic) → void) → void local2b;
+  ((self::Class<dynamic>) → void) → void local3a;
+  ((self::Class<dynamic>) → void) → void local3b;
+  ((self::Class<dynamic>) → void) → void local4a;
+  ((self::Class<dynamic>) → void) → void local4b;
+  ((self::ConcreteClass) → void) → void local5a;
+  ((self::ConcreteClass) → void) → void local5b;
+  ((self::Class<self::ConcreteClass>) → void) → void local6a;
+  ((self::Class<self::ConcreteClass>) → void) → void local6b;
+  ((core::Object) → void) → void local7a;
+  ((core::Object) → void) → void local7b;
+  ((core::int) → void) → void local8a;
+  ((core::int) → void) → void local8b;
+  ((self::G<self::Class<dynamic>>) → void) → void local1c;
+  ((self::G<self::Class<dynamic>>) → void) → void local1d;
+  ((self::G<dynamic>) → void) → void local2c;
+  ((self::G<dynamic>) → void) → void local2d;
+  ((self::G<self::Class<dynamic>>) → void) → void local3c;
+  ((self::G<self::Class<dynamic>>) → void) → void local3d;
+  ((self::G<self::Class<dynamic>>) → void) → void local4c;
+  ((self::G<self::Class<dynamic>>) → void) → void local4d;
+  ((self::G<self::ConcreteClass>) → void) → void local5c;
+  ((self::G<self::ConcreteClass>) → void) → void local5d;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6c;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6d;
+  ((self::G<core::Object>) → void) → void local7c;
+  ((self::G<core::Object>) → void) → void local8d;
+  ((self::G<core::int>) → void) → void local8c;
+  ((self::G<core::int>) → void) → void local7d;
+}
+static method test5() → dynamic {
+  ((self::Class<dynamic>) → void) → void local1a;
+  ((self::Class<dynamic>) → void) → void local1b;
+  ((dynamic) → void) → void local2a;
+  ((dynamic) → void) → void local2b;
+  ((self::Class<dynamic>) → void) → void local3a;
+  ((self::Class<dynamic>) → void) → void local3b;
+  ((self::Class<dynamic>) → void) → void local4a;
+  ((self::Class<dynamic>) → void) → void local4b;
+  ((self::ConcreteClass) → void) → void local5a;
+  ((self::ConcreteClass) → void) → void local5b;
+  ((self::Class<self::ConcreteClass>) → void) → void local6a;
+  ((self::Class<self::ConcreteClass>) → void) → void local6b;
+  ((core::Object) → void) → void local7a;
+  ((core::Object) → void) → void local7b;
+  ((core::int) → void) → void local8a;
+  ((core::int) → void) → void local8b;
+  ((self::G<self::Class<dynamic>>) → void) → void local1c;
+  ((self::G<self::Class<dynamic>>) → void) → void local1d;
+  ((self::G<dynamic>) → void) → void local2c;
+  ((self::G<dynamic>) → void) → void local2d;
+  ((self::G<self::Class<dynamic>>) → void) → void local3c;
+  ((self::G<self::Class<dynamic>>) → void) → void local3d;
+  ((self::G<self::Class<dynamic>>) → void) → void local4c;
+  ((self::G<self::Class<dynamic>>) → void) → void local4d;
+  ((self::G<self::ConcreteClass>) → void) → void local5c;
+  ((self::G<self::ConcreteClass>) → void) → void local5d;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6c;
+  ((self::G<self::Class<self::ConcreteClass>>) → void) → void local6d;
+  ((self::G<core::Object>) → void) → void local7c;
+  ((self::G<core::Object>) → void) → void local8d;
+  ((self::G<core::int>) → void) → void local8c;
+  ((self::G<core::int>) → void) → void local7d;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect
index 17fbc7c..699f60e 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.expect
@@ -32,70 +32,70 @@
 // class Ef1<X extends Function({int})> {
 //                                  ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:67:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Bm2<Z> extends Object with Am2<Function(int), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:70:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:86:34: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Jm2<Z> extends Object with Am2<Function, Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:89:34: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:95:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Mm2<Z> = Object with Am2<Function(int), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:98:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Nm2<Z> = Object with Am2<Function(int x), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:114:28: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Um2<Z> = Object with Am2<Function, Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:117:28: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect
index 17fbc7c..699f60e 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect
@@ -32,70 +32,70 @@
 // class Ef1<X extends Function({int})> {
 //                                  ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:67:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Bm2<Z> extends Object with Am2<Function(int), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:70:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:86:34: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Jm2<Z> extends Object with Am2<Function, Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:89:34: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:95:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Mm2<Z> = Object with Am2<Function(int), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:98:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Nm2<Z> = Object with Am2<Function(int x), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:114:28: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Um2<Z> = Object with Am2<Function, Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:117:28: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect
index 118b670..a3766e6 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.outline.expect
@@ -32,70 +32,70 @@
 // class Ef1<X extends Function({int})> {
 //                                  ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:67:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Bm2<Z> extends Object with Am2<Function(int), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:70:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:86:34: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Jm2<Z> extends Object with Am2<Function, Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:89:34: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:95:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Mm2<Z> = Object with Am2<Function(int), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:98:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Nm2<Z> = Object with Am2<Function(int x), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:114:28: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Um2<Z> = Object with Am2<Function, Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:117:28: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect
index 44336bf..6e346c2 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.transformed.expect
@@ -32,70 +32,70 @@
 // class Ef1<X extends Function({int})> {
 //                                  ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:67:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Bm2<Z> extends Object with Am2<Function(int), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:70:34: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:86:34: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Jm2<Z> extends Object with Am2<Function, Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:89:34: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
-//       ^
+//                                  ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:95:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Mm2<Z> = Object with Am2<Function(int), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:98:28: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 // Try changing type arguments so that they conform to the bounds.
 // class Nm2<Z> = Object with Am2<Function(int x), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:114:28: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Um2<Z> = Object with Am2<Function, Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
 //
-// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+// pkg/front_end/testcases/general/clone_function_type.dart:117:28: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2'.
 //  - 'Function' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
-//       ^
+//                            ^
 // pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
 // class Am2<X extends Function(), Y> {}
 //           ^
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart
new file mode 100644
index 0000000..a61fd37
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.12
+
+typedef F = void Function<T>();
+
+T method<T>() => throw '';
+
+test(F f) {
+  f = method();
+  var list = [f];
+  var set = {f};
+  var map1 = {f: 1};
+  var map2 = {1: f};
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.textual_outline.expect b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.textual_outline.expect
new file mode 100644
index 0000000..f825256
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+// @dart = 2.12
+typedef F = void Function<T>();
+T method<T>() => throw '';
+test(F f) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..edecddf
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+// @dart = 2.12
+T method<T>() => throw '';
+main() {}
+test(F f) {}
+typedef F = void Function<T>();
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.expect b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.expect
new file mode 100644
index 0000000..07471ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:12:7: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   f = method();
+//       ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:13:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var list = [f];
+//              ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:14:13: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var set = {f};
+//             ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:15:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var map1 = {f: 1};
+//              ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:16:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var map2 = {1: f};
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F = <T extends core::Object? = dynamic>() → void;
+static method method<T extends core::Object? = dynamic>() → self::method::T%
+  return throw "";
+static method test(<T extends core::Object? = dynamic>() → void f) → dynamic {
+  f = self::method<<T extends core::Object? = dynamic>() → void>();
+  core::List<<T extends core::Object? = dynamic>() → void> list = <<T extends core::Object? = dynamic>() → void>[f];
+  core::Set<<T extends core::Object? = dynamic>() → void> set = block {
+    final core::Set<<T extends core::Object? = dynamic>() → void> #t1 = col::LinkedHashSet::•<<T extends core::Object? = dynamic>() → void>();
+    #t1.{core::Set::add}{Invariant}(f){(<T extends core::Object? = dynamic>() → void) → core::bool};
+  } =>#t1;
+  core::Map<<T extends core::Object? = dynamic>() → void, core::int> map1 = <<T extends core::Object? = dynamic>() → void, core::int>{f: 1};
+  core::Map<core::int, <T extends core::Object? = dynamic>() → void> map2 = <core::int, <T extends core::Object? = dynamic>() → void>{1: f};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.modular.expect b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.modular.expect
new file mode 100644
index 0000000..07471ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:12:7: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   f = method();
+//       ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:13:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var list = [f];
+//              ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:14:13: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var set = {f};
+//             ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:15:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var map1 = {f: 1};
+//              ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:16:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var map2 = {1: f};
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F = <T extends core::Object? = dynamic>() → void;
+static method method<T extends core::Object? = dynamic>() → self::method::T%
+  return throw "";
+static method test(<T extends core::Object? = dynamic>() → void f) → dynamic {
+  f = self::method<<T extends core::Object? = dynamic>() → void>();
+  core::List<<T extends core::Object? = dynamic>() → void> list = <<T extends core::Object? = dynamic>() → void>[f];
+  core::Set<<T extends core::Object? = dynamic>() → void> set = block {
+    final core::Set<<T extends core::Object? = dynamic>() → void> #t1 = col::LinkedHashSet::•<<T extends core::Object? = dynamic>() → void>();
+    #t1.{core::Set::add}{Invariant}(f){(<T extends core::Object? = dynamic>() → void) → core::bool};
+  } =>#t1;
+  core::Map<<T extends core::Object? = dynamic>() → void, core::int> map1 = <<T extends core::Object? = dynamic>() → void, core::int>{f: 1};
+  core::Map<core::int, <T extends core::Object? = dynamic>() → void> map2 = <core::int, <T extends core::Object? = dynamic>() → void>{1: f};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.outline.expect b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.outline.expect
new file mode 100644
index 0000000..b8d645e
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.outline.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>() → void;
+static method method<T extends core::Object? = dynamic>() → self::method::T%
+  ;
+static method test(<T extends core::Object? = dynamic>() → void f) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.transformed.expect b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.transformed.expect
new file mode 100644
index 0000000..ccf2bce
--- /dev/null
+++ b/pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart.weak.transformed.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:12:7: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   f = method();
+//       ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:13:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var list = [f];
+//              ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:14:13: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var set = {f};
+//             ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:15:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var map1 = {f: 1};
+//              ^
+//
+// pkg/front_end/testcases/general/inferred_generic_function_type_argument.dart:16:14: Error: Generic function type 'void Function<T>()' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   var map2 = {1: f};
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+typedef F = <T extends core::Object? = dynamic>() → void;
+static method method<T extends core::Object? = dynamic>() → self::method::T%
+  return throw "";
+static method test(<T extends core::Object? = dynamic>() → void f) → dynamic {
+  f = self::method<<T extends core::Object? = dynamic>() → void>();
+  core::List<<T extends core::Object? = dynamic>() → void> list = core::_GrowableList::_literal1<<T extends core::Object? = dynamic>() → void>(f);
+  core::Set<<T extends core::Object? = dynamic>() → void> set = block {
+    final core::Set<<T extends core::Object? = dynamic>() → void> #t1 = new col::_CompactLinkedHashSet::•<<T extends core::Object? = dynamic>() → void>();
+    #t1.{core::Set::add}{Invariant}(f){(<T extends core::Object? = dynamic>() → void) → core::bool};
+  } =>#t1;
+  core::Map<<T extends core::Object? = dynamic>() → void, core::int> map1 = <<T extends core::Object? = dynamic>() → void, core::int>{f: 1};
+  core::Map<core::int, <T extends core::Object? = dynamic>() → void> map2 = <core::int, <T extends core::Object? = dynamic>() → void>{1: f};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.expect
index 0f8715b..795ef97 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.expect
@@ -2,58 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue44476.dart:7:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:7:5: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // foo(A<num> x) {
+//     ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:8:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   bar(A<num> y) {
+//       ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:9:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//     barbar(A<num> yy) => null;
 //            ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/issue44476.dart:9:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:11:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-//     barbar(A<num> yy) => null;
-//                   ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:8:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   bar(A<num> y) {
+//   var baz = (A<num> z) {
 //              ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/issue44476.dart:12:26: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:12:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //     var bazbaz = (A<num> zz) => null;
-//                          ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:12:9: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//     var bazbaz = (A<num> zz) => null;
-//         ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:11:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   var baz = (A<num> z) {
-//                     ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:11:7: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   var baz = (A<num> z) {
-//       ^
+//                   ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect
index 0f8715b..795ef97 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect
@@ -2,58 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue44476.dart:7:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:7:5: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // foo(A<num> x) {
+//     ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:8:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   bar(A<num> y) {
+//       ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:9:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//     barbar(A<num> yy) => null;
 //            ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/issue44476.dart:9:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:11:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-//     barbar(A<num> yy) => null;
-//                   ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:8:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   bar(A<num> y) {
+//   var baz = (A<num> z) {
 //              ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/issue44476.dart:12:26: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:12:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //     var bazbaz = (A<num> zz) => null;
-//                          ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:12:9: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//     var bazbaz = (A<num> zz) => null;
-//         ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:11:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   var baz = (A<num> z) {
-//                     ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:11:7: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   var baz = (A<num> z) {
-//       ^
+//                   ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect
index ab893e2..47fde5e 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.outline.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue44476.dart:7:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:7:5: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // foo(A<num> x) {
-//            ^
+//     ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect
index 0f8715b..795ef97 100644
--- a/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.transformed.expect
@@ -2,58 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue44476.dart:7:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:7:5: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // foo(A<num> x) {
+//     ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:8:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   bar(A<num> y) {
+//       ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:9:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//     barbar(A<num> yy) => null;
 //            ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/issue44476.dart:9:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:11:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-//     barbar(A<num> yy) => null;
-//                   ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:8:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   bar(A<num> y) {
+//   var baz = (A<num> z) {
 //              ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/issue44476.dart:12:26: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/issue44476.dart:12:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //     var bazbaz = (A<num> zz) => null;
-//                          ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:12:9: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//     var bazbaz = (A<num> zz) => null;
-//         ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:11:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   var baz = (A<num> z) {
-//                     ^
-// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/issue44476.dart:11:7: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   var baz = (A<num> z) {
-//       ^
+//                   ^
 // pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/general/nested_variance2.dart.weak.expect b/pkg/front_end/testcases/general/nested_variance2.dart.weak.expect
index 8c5790b..130bce3 100644
--- a/pkg/front_end/testcases/general/nested_variance2.dart.weak.expect
+++ b/pkg/front_end/testcases/general/nested_variance2.dart.weak.expect
@@ -2,64 +2,36 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-// pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
-// class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
-//                                                         ^
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Context: If you want 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
-//  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'Object' is from 'dart:core'.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-//
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-// pkg/front_end/testcases/general/nested_variance2.dart:49:27: Context: This is the type variable whose bound isn't conformed to.
-// typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);
-//                           ^
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Context: If you want 'FinvCyclicCoBound<dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
-//  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'Object' is from 'dart:core'.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-//
 // pkg/front_end/testcases/general/nested_variance2.dart:84:42: Error: A value of type 'void Function<Y extends Acon<dynamic Function(Never), dynamic>>()' can't be assigned to a variable of type 'void Function<Y extends Acon<dynamic Function(Null), dynamic>>()' because 'Null' is nullable and 'Never' isn't.
 //  - 'Acon' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //   F<Acon<Fcon<Null>, dynamic>> target2 = fsource2;
 //                                          ^
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+// pkg/front_end/testcases/general/nested_variance2.dart:177:3: Error: Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
+//   ^
 // pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
 // class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
 //                                                         ^
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Context: If you want 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'B<AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/general/nested_variance2.dart:177:3: Context: If you want 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
 //  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //  - 'Object' is from 'dart:core'.
-//   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
+//   ^
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
+// pkg/front_end/testcases/general/nested_variance2.dart:236:5: Error: Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 //   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
-// pkg/front_end/testcases/general/nested_variance2.dart:49:27: Context: This is the type variable whose bound isn't conformed to.
-// typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);
-//                           ^
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Context: If you want 'FinvCyclicCoBound<dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'B<AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>>' must then satisfy its bounds, which it does not.
-//  - 'B' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
+//     ^
+// pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
+// class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
+//                                                         ^
+// pkg/front_end/testcases/general/nested_variance2.dart:236:5: Context: If you want 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
 //  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //  - 'Object' is from 'dart:core'.
 //   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+//     ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/nested_variance2.dart.weak.modular.expect b/pkg/front_end/testcases/general/nested_variance2.dart.weak.modular.expect
index 8c5790b..130bce3 100644
--- a/pkg/front_end/testcases/general/nested_variance2.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/nested_variance2.dart.weak.modular.expect
@@ -2,64 +2,36 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-// pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
-// class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
-//                                                         ^
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Context: If you want 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
-//  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'Object' is from 'dart:core'.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-//
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-// pkg/front_end/testcases/general/nested_variance2.dart:49:27: Context: This is the type variable whose bound isn't conformed to.
-// typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);
-//                           ^
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Context: If you want 'FinvCyclicCoBound<dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
-//  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'Object' is from 'dart:core'.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-//
 // pkg/front_end/testcases/general/nested_variance2.dart:84:42: Error: A value of type 'void Function<Y extends Acon<dynamic Function(Never), dynamic>>()' can't be assigned to a variable of type 'void Function<Y extends Acon<dynamic Function(Null), dynamic>>()' because 'Null' is nullable and 'Never' isn't.
 //  - 'Acon' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //   F<Acon<Fcon<Null>, dynamic>> target2 = fsource2;
 //                                          ^
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+// pkg/front_end/testcases/general/nested_variance2.dart:177:3: Error: Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
+//   ^
 // pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
 // class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
 //                                                         ^
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Context: If you want 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'B<AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/general/nested_variance2.dart:177:3: Context: If you want 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
 //  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //  - 'Object' is from 'dart:core'.
-//   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
+//   ^
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
+// pkg/front_end/testcases/general/nested_variance2.dart:236:5: Error: Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 //   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
-// pkg/front_end/testcases/general/nested_variance2.dart:49:27: Context: This is the type variable whose bound isn't conformed to.
-// typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);
-//                           ^
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Context: If you want 'FinvCyclicCoBound<dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'B<AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>>' must then satisfy its bounds, which it does not.
-//  - 'B' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
+//     ^
+// pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
+// class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
+//                                                         ^
+// pkg/front_end/testcases/general/nested_variance2.dart:236:5: Context: If you want 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
 //  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //  - 'Object' is from 'dart:core'.
 //   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+//     ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/nested_variance2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/nested_variance2.dart.weak.transformed.expect
index 77f1c4c..2b81a6e 100644
--- a/pkg/front_end/testcases/general/nested_variance2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/nested_variance2.dart.weak.transformed.expect
@@ -2,64 +2,36 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-// pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
-// class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
-//                                                         ^
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Context: If you want 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
-//  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'Object' is from 'dart:core'.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-//
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-// pkg/front_end/testcases/general/nested_variance2.dart:49:27: Context: This is the type variable whose bound isn't conformed to.
-// typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);
-//                           ^
-// pkg/front_end/testcases/general/nested_variance2.dart:177:21: Context: If you want 'FinvCyclicCoBound<dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
-//  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'Object' is from 'dart:core'.
-//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
-//                     ^
-//
 // pkg/front_end/testcases/general/nested_variance2.dart:84:42: Error: A value of type 'void Function<Y extends Acon<dynamic Function(Never), dynamic>>()' can't be assigned to a variable of type 'void Function<Y extends Acon<dynamic Function(Null), dynamic>>()' because 'Null' is nullable and 'Never' isn't.
 //  - 'Acon' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //   F<Acon<Fcon<Null>, dynamic>> target2 = fsource2;
 //                                          ^
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+// pkg/front_end/testcases/general/nested_variance2.dart:177:3: Error: Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
+//   ^
 // pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
 // class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
 //                                                         ^
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Context: If you want 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'B<AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/general/nested_variance2.dart:177:3: Context: If you want 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
 //  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //  - 'Object' is from 'dart:core'.
-//   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+//   AinvCyclicCoBound source12 = throw ''; //# 02: compile-time error
+//   ^
 //
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Error: Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
-// Try changing type arguments so that they conform to the bounds.
+// pkg/front_end/testcases/general/nested_variance2.dart:236:5: Error: Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 //   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
-// pkg/front_end/testcases/general/nested_variance2.dart:49:27: Context: This is the type variable whose bound isn't conformed to.
-// typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);
-//                           ^
-// pkg/front_end/testcases/general/nested_variance2.dart:236:24: Context: If you want 'FinvCyclicCoBound<dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'B<AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>>' must then satisfy its bounds, which it does not.
-//  - 'B' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
+//     ^
+// pkg/front_end/testcases/general/nested_variance2.dart:57:57: Context: This is the type variable whose bound isn't conformed to.
+// class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
+//                                                         ^
+// pkg/front_end/testcases/general/nested_variance2.dart:236:5: Context: If you want 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' to be a super-bounded type, note that the inverted type 'AinvCyclicCoBound<FinvCyclicCoBound<Never Function(Never)>, Never Function(Object?)>' must then satisfy its bounds, which it does not.
 //  - 'AinvCyclicCoBound' is from 'pkg/front_end/testcases/general/nested_variance2.dart'.
 //  - 'Object' is from 'dart:core'.
 //   B<AinvCyclicCoBound> source12 = throw ''; //# 04: compile-time error
-//                        ^
+//     ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/super_bounded.dart b/pkg/front_end/testcases/general/super_bounded.dart
new file mode 100644
index 0000000..6d74f81
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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 F<X> = X Function(X);
+
+class A<T> {}
+
+class Class<T extends A<T>> {}
+
+method(Class c1, Class<dynamic> c2) {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/super_bounded.dart.textual_outline.expect b/pkg/front_end/testcases/general/super_bounded.dart.textual_outline.expect
new file mode 100644
index 0000000..ca7b1c6
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+typedef F<X> = X Function(X);
+
+class A<T> {}
+
+class Class<T extends A<T>> {}
+
+method(Class c1, Class<dynamic> c2) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/super_bounded.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/super_bounded.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c1e72c5
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+class A<T> {}
+
+class Class<T extends A<T>> {}
+
+main() {}
+method(Class c1, Class<dynamic> c2) {}
+typedef F<X> = X Function(X);
diff --git a/pkg/front_end/testcases/general/super_bounded.dart.weak.expect b/pkg/front_end/testcases/general/super_bounded.dart.weak.expect
new file mode 100644
index 0000000..d6a4196
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends self::A<self::Class::T> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static method method(self::Class<self::A<dynamic>> c1, self::Class<dynamic> c2) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_bounded.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_bounded.dart.weak.modular.expect
new file mode 100644
index 0000000..d6a4196
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends self::A<self::Class::T> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static method method(self::Class<self::A<dynamic>> c1, self::Class<dynamic> c2) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_bounded.dart.weak.outline.expect b/pkg/front_end/testcases/general/super_bounded.dart.weak.outline.expect
new file mode 100644
index 0000000..7bae477
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart.weak.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    ;
+}
+class Class<T extends self::A<self::Class::T> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    ;
+}
+static method method(self::Class<self::A<dynamic>> c1, self::Class<dynamic> c2) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/super_bounded.dart.weak.transformed.expect b/pkg/front_end/testcases/general/super_bounded.dart.weak.transformed.expect
new file mode 100644
index 0000000..d6a4196
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_bounded.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object? = dynamic> = (X%) → X%;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends self::A<self::Class::T> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static method method(self::Class<self::A<dynamic>> c1, self::Class<dynamic> c2) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect
index 145ed00..aae0506 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//                       ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> staticFieldOfA; // Error.
 //          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num> staticFieldOfA; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// extension E<X extends A<num>> // Error.
-//             ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   static A<num> fieldOfE; // Error.
-//                 ^
+//          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fooOfE() => null; // Error.
-//                ^
+//   ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void bazOfE<Y extends A<num>>() {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect
index 145ed00..aae0506 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//                       ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> staticFieldOfA; // Error.
 //          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num> staticFieldOfA; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// extension E<X extends A<num>> // Error.
-//             ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   static A<num> fieldOfE; // Error.
-//                 ^
+//          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fooOfE() => null; // Error.
-//                ^
+//   ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void bazOfE<Y extends A<num>>() {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect
index 401ed4e..e65a4dc 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.outline.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//                       ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> staticFieldOfA; // Error.
 //          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num> staticFieldOfA; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// extension E<X extends A<num>> // Error.
-//             ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   static A<num> fieldOfE; // Error.
-//                 ^
+//          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fooOfE() => null; // Error.
-//                ^
+//   ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void bazOfE<Y extends A<num>>() {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect
index 145ed00..aae0506 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.transformed.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//                       ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:10:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> staticFieldOfA; // Error.
 //          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:11:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num> staticFieldOfA; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// extension E<X extends A<num>> // Error.
-//             ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   static A<num> fieldOfE; // Error.
-//                 ^
+//          ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num> fooOfE() => null; // Error.
-//                ^
+//   ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:18:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:19:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void bazOfE<Y extends A<num>>() {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.expect
index c19f798..7f9ecea 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fieldOfA; // Error.
-//           ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? staticFieldOfA; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // extension E<X extends A<num>> // Error.
-//             ^
+//                       ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? fieldOfE; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fooOfE() => null; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? staticFieldOfA; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? fieldOfE; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fooOfE() => null; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.modular.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.modular.expect
index c19f798..7f9ecea 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.modular.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fieldOfA; // Error.
-//           ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? staticFieldOfA; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // extension E<X extends A<num>> // Error.
-//             ^
+//                       ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? fieldOfE; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fooOfE() => null; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? staticFieldOfA; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? fieldOfE; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fooOfE() => null; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.outline.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.outline.expect
index ed99e3a..3047353 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.outline.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fieldOfA; // Error.
-//           ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? staticFieldOfA; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // extension E<X extends A<num>> // Error.
-//             ^
+//                       ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? fieldOfE; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fooOfE() => null; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? staticFieldOfA; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? fieldOfE; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fooOfE() => null; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.transformed.expect
index c19f798..7f9ecea 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart.weak.transformed.expect
@@ -2,57 +2,57 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fieldOfA; // Error.
-//           ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? staticFieldOfA; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:12:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // extension E<X extends A<num>> // Error.
-//             ^
+//                       ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   static A<num>? fieldOfE; // Error.
-//                  ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-//   A<num>? fooOfE() => null; // Error.
-//                 ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-//   void barOfE(A<num> a) {} // Error.
-//                      ^
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:17:25: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   void bazOfE<Y extends A<num>>() {} // Error.
+//                         ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:8:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fieldOfA; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:9:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? staticFieldOfA; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:14:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num>? fieldOfE; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:15:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num>? fooOfE() => null; // Error.
+//   ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:16:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
 //               ^
 // pkg/front_end/testcases/general/well_boundness_checks_in_outline2.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends int> {}
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart
new file mode 100644
index 0000000..314fc2a
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.12
+
+import 'alias_from_opt_in_lib.dart';
+
+test(
+  T1 t1a, // Ok
+  List<T1> t1b, // Error
+  void Function(T1) t1c, // Ok
+  void Function(List<T1>) t1d, // Error
+  T2 t2a, // Ok
+  List<T2> t2b, // // Ok
+  void Function(T2) t2c, // Ok
+  void Function(List<T2>) t2d, // // Ok
+  T3 t3a, // Error
+  List<T3> t3b, // Error
+  void Function(T3) t3c, // Error
+  void Function(List<T3>) t3d, // Error
+  T4 t4a, // Error,
+  List<T4> t4b, // Error,
+  void Function(T4) t4c, // Error
+  void Function(List<T4>) t4d, // Error
+) {
+  new T4(); // Error
+  <T4>[]; // Error
+  <void Function(T4)>[]; // Error
+  <void Function(List<T4>)>[]; // Error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.expect
new file mode 100644
index 0000000..046ad77
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.expect
@@ -0,0 +1,110 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:11:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   List<T1> t1b, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:13:17: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   void Function(List<T1>) t1d, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:22:3: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   T4 t4a, // Error,
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:23:8: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   List<T4> t4b, // Error,
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:24:17: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(T4) t4c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:25:22: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T4>) t4d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   T3 t3a, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:19:8: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   List<T3> t3b, // Error
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:20:17: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(T3) t3c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:21:22: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T3>) t3d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:27:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   new T4(); // Error
+//       ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:28:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <T4>[]; // Error
+//    ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:29:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(T4)>[]; // Error
+//                  ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:30:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(List<T4>)>[]; // Error
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+import "alias_from_opt_in_lib.dart" as ali;
+
+import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
+
+static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+  <ali::Class<<T extends core::Object? = dynamic>(T%) → void>>[];
+  <(ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void>[];
+  <(core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void>[];
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as ali;
+import "dart:core" as core;
+
+typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
+typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
+typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
+typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → ali::Class<ali::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+}
+static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
+  return new ali::Class::•<ali::_#T4#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.transformed.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.transformed.expect
new file mode 100644
index 0000000..0ef0673
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.transformed.expect
@@ -0,0 +1,110 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:11:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   List<T1> t1b, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:13:17: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   void Function(List<T1>) t1d, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:22:3: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   T4 t4a, // Error,
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:23:8: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   List<T4> t4b, // Error,
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:24:17: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(T4) t4c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:25:22: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T4>) t4d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   T3 t3a, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:19:8: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   List<T3> t3b, // Error
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:20:17: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(T3) t3c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:21:22: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T3>) t3d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:27:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   new T4(); // Error
+//       ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:28:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <T4>[]; // Error
+//    ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:29:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(T4)>[]; // Error
+//                  ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:30:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(List<T4>)>[]; // Error
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+import "alias_from_opt_in_lib.dart" as ali;
+
+import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
+
+static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+  core::_GrowableList::•<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>(0);
+  core::_GrowableList::•<(ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void>(0);
+  core::_GrowableList::•<(core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void>(0);
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as ali;
+import "dart:core" as core;
+
+typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
+typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
+typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
+typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → ali::Class<ali::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+}
+static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
+  return new ali::Class::•<ali::_#T4#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.textual_outline.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.textual_outline.expect
new file mode 100644
index 0000000..bc7045b
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.textual_outline.expect
@@ -0,0 +1,22 @@
+// @dart = 2.12
+import 'alias_from_opt_in_lib.dart';
+
+test(
+  T1 t1a,
+  List<T1> t1b,
+  void Function(T1) t1c,
+  void Function(List<T1>) t1d,
+  T2 t2a,
+  List<T2> t2b,
+  void Function(T2) t2c,
+  void Function(List<T2>) t2d,
+  T3 t3a,
+  List<T3> t3b,
+  void Function(T3) t3c,
+  void Function(List<T3>) t3d,
+  T4 t4a,
+  List<T4> t4b,
+  void Function(T4) t4c,
+  void Function(List<T4>) t4d,
+) {}
+main() {}
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..803b7714
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.textual_outline_modelled.expect
@@ -0,0 +1,22 @@
+// @dart = 2.12
+import 'alias_from_opt_in_lib.dart';
+
+main() {}
+test(
+  T1 t1a,
+  List<T1> t1b,
+  void Function(T1) t1c,
+  void Function(List<T1>) t1d,
+  T2 t2a,
+  List<T2> t2b,
+  void Function(T2) t2c,
+  void Function(List<T2>) t2d,
+  T3 t3a,
+  List<T3> t3b,
+  void Function(T3) t3c,
+  void Function(List<T3>) t3d,
+  T4 t4a,
+  List<T4> t4b,
+  void Function(T4) t4c,
+  void Function(List<T4>) t4d,
+) {}
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.expect
new file mode 100644
index 0000000..046ad77
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.expect
@@ -0,0 +1,110 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:11:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   List<T1> t1b, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:13:17: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   void Function(List<T1>) t1d, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:22:3: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   T4 t4a, // Error,
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:23:8: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   List<T4> t4b, // Error,
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:24:17: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(T4) t4c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:25:22: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T4>) t4d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   T3 t3a, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:19:8: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   List<T3> t3b, // Error
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:20:17: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(T3) t3c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:21:22: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T3>) t3d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:27:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   new T4(); // Error
+//       ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:28:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <T4>[]; // Error
+//    ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:29:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(T4)>[]; // Error
+//                  ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:30:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(List<T4>)>[]; // Error
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+import "alias_from_opt_in_lib.dart" as ali;
+
+import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
+
+static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+  <ali::Class<<T extends core::Object? = dynamic>(T%) → void>>[];
+  <(ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void>[];
+  <(core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void>[];
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as ali;
+import "dart:core" as core;
+
+typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
+typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
+typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
+typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → ali::Class<ali::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+}
+static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
+  return new ali::Class::•<ali::_#T4#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..046ad77
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,110 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:11:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   List<T1> t1b, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:13:17: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   void Function(List<T1>) t1d, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:22:3: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   T4 t4a, // Error,
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:23:8: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   List<T4> t4b, // Error,
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:24:17: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(T4) t4c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:25:22: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T4>) t4d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   T3 t3a, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:19:8: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   List<T3> t3b, // Error
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:20:17: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(T3) t3c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:21:22: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T3>) t3d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:27:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   new T4(); // Error
+//       ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:28:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <T4>[]; // Error
+//    ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:29:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(T4)>[]; // Error
+//                  ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:30:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(List<T4>)>[]; // Error
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+import "alias_from_opt_in_lib.dart" as ali;
+
+import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
+
+static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+  <ali::Class<<T extends core::Object? = dynamic>(T%) → void>>[];
+  <(ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void>[];
+  <(core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void>[];
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as ali;
+import "dart:core" as core;
+
+typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
+typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
+typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
+typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → ali::Class<ali::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+}
+static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
+  return new ali::Class::•<ali::_#T4#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.outline.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.outline.expect
new file mode 100644
index 0000000..08796ca
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.outline.expect
@@ -0,0 +1,85 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:11:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   List<T1> t1b, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:13:17: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   void Function(List<T1>) t1d, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:22:3: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   T4 t4a, // Error,
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:23:8: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   List<T4> t4b, // Error,
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:24:17: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(T4) t4c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:25:22: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T4>) t4d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   T3 t3a, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:19:8: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   List<T3> t3b, // Error
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:20:17: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(T3) t3c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:21:22: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T3>) t3d, // Error
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+import "alias_from_opt_in_lib.dart" as ali;
+
+import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
+
+static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as ali;
+import "dart:core" as core;
+
+typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
+typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
+typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
+typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → ali::Class<ali::Class::T%>
+    ;
+}
+static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic
+  ;
+static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
+  return new ali::Class::•<ali::_#T4#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.transformed.expect
new file mode 100644
index 0000000..0ef0673
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.weak.transformed.expect
@@ -0,0 +1,110 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:11:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   List<T1> t1b, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:13:17: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   void Function(List<T1>) t1d, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:22:3: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   T4 t4a, // Error,
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:23:8: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   List<T4> t4b, // Error,
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:24:17: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(T4) t4c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:25:22: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T4>) t4d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   T3 t3a, // Error
+//   ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:19:8: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   List<T3> t3b, // Error
+//        ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:20:17: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(T3) t3c, // Error
+//                 ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:21:22: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
+//  - 'List' is from 'dart:core'.
+// Try providing a non-generic function type explicitly.
+//   void Function(List<T3>) t3d, // Error
+//                      ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:27:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   new T4(); // Error
+//       ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:28:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <T4>[]; // Error
+//    ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:29:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(T4)>[]; // Error
+//                  ^
+//
+// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:30:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
+// Try providing a non-generic function type explicitly.
+//   <void Function(List<T4>)>[]; // Error
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+import "alias_from_opt_in_lib.dart" as ali;
+
+import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
+
+static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+  core::_GrowableList::•<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>(0);
+  core::_GrowableList::•<(ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void>(0);
+  core::_GrowableList::•<(core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void>(0);
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as ali;
+import "dart:core" as core;
+
+typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
+typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
+typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
+typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → ali::Class<ali::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic {
+  new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
+}
+static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
+  return new ali::Class::•<ali::_#T4#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/generic_metadata/alias_from_opt_in_lib.dart b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in_lib.dart
new file mode 100644
index 0000000..b1b273a
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/alias_from_opt_in_lib.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {}
+
+typedef T1 = void Function<T>(T);
+typedef T2 = void Function(void Function<T>(T));
+typedef T3 = List<void Function<T>(T)>;
+typedef T4<X extends void Function<T>(T)> = Class<X>;
+
+test(
+  T1 t1, // Ok
+  T1 t2, // Ok
+  T3 t3, // Ok
+) {
+  new T4(); // Ok
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect
index 3ed0854..cdeaa48 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.expect
@@ -12,16 +12,6 @@
 // class C<T extends A> {
 //         ^
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:29: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
-//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   var /*@ type=C<NotA*>* */ x =
-//                             ^
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: This is the type variable whose bound isn't conformed to.
-// class C<T extends A> {
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect
index 3ed0854..cdeaa48 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect
@@ -12,16 +12,6 @@
 // class C<T extends A> {
 //         ^
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:29: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
-//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   var /*@ type=C<NotA*>* */ x =
-//                             ^
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: This is the type variable whose bound isn't conformed to.
-// class C<T extends A> {
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.expect
index 69d5022..05a10e7 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:25: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0'.
 //  - 'Comparable' is from 'dart:core'.
-// Try changing type arguments so that they conform to the bounds.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // class A extends M1 with M0 {}
-//       ^
+//                         ^
 // pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
 // class M0<X, Y extends Comparable<Y>> extends I<X> {}
 //             ^
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect
index 69d5022..05a10e7 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:25: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0'.
 //  - 'Comparable' is from 'dart:core'.
-// Try changing type arguments so that they conform to the bounds.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // class A extends M1 with M0 {}
-//       ^
+//                         ^
 // pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
 // class M0<X, Y extends Comparable<Y>> extends I<X> {}
 //             ^
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.outline.expect
index c887609..98c5c87 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.outline.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:25: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0'.
 //  - 'Comparable' is from 'dart:core'.
-// Try changing type arguments so that they conform to the bounds.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // class A extends M1 with M0 {}
-//       ^
+//                         ^
 // pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
 // class M0<X, Y extends Comparable<Y>> extends I<X> {}
 //             ^
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.transformed.expect
index c133ecb..06c6423 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:25: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0'.
 //  - 'Comparable' is from 'dart:core'.
-// Try changing type arguments so that they conform to the bounds.
+// Try specifying type arguments explicitly so that they conform to the bounds.
 // class A extends M1 with M0 {}
-//       ^
+//                         ^
 // pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
 // class M0<X, Y extends Comparable<Y>> extends I<X> {}
 //             ^
diff --git a/pkg/front_end/testcases/modular.status b/pkg/front_end/testcases/modular.status
index a3e7ee6..b2aa3a1 100644
--- a/pkg/front_end/testcases/modular.status
+++ b/pkg/front_end/testcases/modular.status
@@ -23,6 +23,7 @@
 extensions/extension_setter_error: TypeCheckError
 general/abstract_members: TypeCheckError
 general/bounded_implicit_instantiation: TypeCheckError
+general/bounds_instances: TypeCheckError
 general/bug30695: TypeCheckError
 general/covariant_field: TypeCheckError
 general/crashes/crash_02/main: Crash
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
index ab741a5..0926cb3 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
@@ -2,42 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-// A<num?>? bar() {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // baz<T extends A<num?>>() {} // Error
+//               ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//                   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:1: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error
-//       ^
+// A<num?>? bar() {} // Error
+// ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error
-//         ^
+// class B extends A<num?> {} // Error
+//                 ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
index ab741a5..0926cb3 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
@@ -2,42 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-// A<num?>? bar() {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // baz<T extends A<num?>>() {} // Error
+//               ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//                   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:1: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error
-//       ^
+// A<num?>? bar() {} // Error
+// ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error
-//         ^
+// class B extends A<num?> {} // Error
+//                 ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
index ab741a5..0926cb3 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
@@ -2,42 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-// A<num?>? bar() {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // baz<T extends A<num?>>() {} // Error
+//               ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//                   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:1: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error
-//       ^
+// A<num?>? bar() {} // Error
+// ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error
-//         ^
+// class B extends A<num?> {} // Error
+//                 ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect
index ab741a5..0926cb3 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect
@@ -2,42 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-// A<num?>? bar() {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // baz<T extends A<num?>>() {} // Error
+//               ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//                   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:1: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error
-//       ^
+// A<num?>? bar() {} // Error
+// ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error
-//         ^
+// class B extends A<num?> {} // Error
+//                 ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect
index be5c01e..47d8657 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.outline.expect
@@ -2,42 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-// A<num?>? bar() {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // baz<T extends A<num?>>() {} // Error
+//               ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//                   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:1: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error
-//       ^
+// A<num?>? bar() {} // Error
+// ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error
-//         ^
+// class B extends A<num?> {} // Error
+//                 ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
index ab741a5..0926cb3 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
@@ -2,42 +2,42 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
-// Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
-// Try changing type arguments so that they conform to the bounds.
-// A<num?>? bar() {} // Error
-//             ^
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 // baz<T extends A<num?>>() {} // Error
+//               ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//                   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:1: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error
-//       ^
+// A<num?>? bar() {} // Error
+// ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error
-//         ^
+// class B extends A<num?> {} // Error
+//                 ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
index 717c859..0cbdeae 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
@@ -2,192 +2,192 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Object> aObject; // Error.
-//             ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num?> aNumNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<int?> aIntNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Null> aNull; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object> fArgumentObject; // Error.
-//                     ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<num?> fArgumentNumNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<int?> fArgumentIntNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Null> fArgumentNull; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Object> fReturnObject; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<num?> fReturnNumNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<int?> fReturnIntNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Null> fReturnNull; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Object> fBothObject; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<num?> fBothNumNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<int?> fBothIntNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Null> fBothNull; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Object> fNowhereObject; // Error.
-//                    ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<num?> fNowhereNumNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<int?> fNowhereIntNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Null> fNowhereNull; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:33:22: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:33:3: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object?> fArgumentObjectNullable; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:34:22: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:34:3: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<dynamic> fArgumentDynamic; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:35:19: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:35:3: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<void> fArgumentVoid; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
index 717c859..0cbdeae 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
@@ -2,192 +2,192 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Object> aObject; // Error.
-//             ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num?> aNumNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<int?> aIntNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Null> aNull; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object> fArgumentObject; // Error.
-//                     ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<num?> fArgumentNumNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<int?> fArgumentIntNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Null> fArgumentNull; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Object> fReturnObject; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<num?> fReturnNumNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<int?> fReturnIntNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Null> fReturnNull; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Object> fBothObject; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<num?> fBothNumNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<int?> fBothIntNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Null> fBothNull; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Object> fNowhereObject; // Error.
-//                    ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<num?> fNowhereNumNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<int?> fNowhereIntNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Null> fNowhereNull; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:33:22: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:33:3: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object?> fArgumentObjectNullable; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:34:22: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:34:3: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<dynamic> fArgumentDynamic; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:35:19: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:35:3: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<void> fArgumentVoid; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
index 717c859..0cbdeae 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
@@ -2,192 +2,192 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Object> aObject; // Error.
-//             ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num?> aNumNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<int?> aIntNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Null> aNull; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object> fArgumentObject; // Error.
-//                     ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<num?> fArgumentNumNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<int?> fArgumentIntNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Null> fArgumentNull; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Object> fReturnObject; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<num?> fReturnNumNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<int?> fReturnIntNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Null> fReturnNull; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Object> fBothObject; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<num?> fBothNumNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<int?> fBothIntNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Null> fBothNull; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Object> fNowhereObject; // Error.
-//                    ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<num?> fNowhereNumNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<int?> fNowhereIntNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Null> fNowhereNull; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:33:22: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:33:3: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object?> fArgumentObjectNullable; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:34:22: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:34:3: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<dynamic> fArgumentDynamic; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:35:19: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:35:3: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<void> fArgumentVoid; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect
index 717c859..0cbdeae 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect
@@ -2,192 +2,192 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Object> aObject; // Error.
-//             ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num?> aNumNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<int?> aIntNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Null> aNull; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object> fArgumentObject; // Error.
-//                     ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<num?> fArgumentNumNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<int?> fArgumentIntNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Null> fArgumentNull; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Object> fReturnObject; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<num?> fReturnNumNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<int?> fReturnIntNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Null> fReturnNull; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Object> fBothObject; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<num?> fBothNumNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<int?> fBothIntNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Null> fBothNull; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Object> fNowhereObject; // Error.
-//                    ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<num?> fNowhereNumNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<int?> fNowhereIntNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Null> fNowhereNull; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:33:22: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:33:3: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object?> fArgumentObjectNullable; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:34:22: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:34:3: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<dynamic> fArgumentDynamic; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:35:19: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:35:3: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<void> fArgumentVoid; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
index 717c859..0cbdeae 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
@@ -2,192 +2,192 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Object> aObject; // Error.
-//             ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<num?> aNumNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<int?> aIntNullable; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
 //   A<Null> aNull; // Error.
-//           ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<T extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object> fArgumentObject; // Error.
-//                     ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<num?> fArgumentNumNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<int?> fArgumentIntNullable; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Null> fArgumentNull; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Object> fReturnObject; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<num?> fReturnNumNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<int?> fReturnIntNullable; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
 // Try changing type arguments so that they conform to the bounds.
 //   FReturn<Null> fReturnNull; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
 // typedef FReturn<X extends num> = X Function();
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Object> fBothObject; // Error.
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<num?> fBothNumNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<int?> fBothIntNullable; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
 // Try changing type arguments so that they conform to the bounds.
 //   FBoth<Null> fBothNull; // Error.
-//               ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
 // typedef FBoth<X extends num> = X Function(X);
 //               ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:3: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Object> fNowhereObject; // Error.
-//                    ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<num?> fNowhereNumNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:3: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<int?> fNowhereIntNullable; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:3: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
 // Try changing type arguments so that they conform to the bounds.
 //   FNowhere<Null> fNowhereNull; // Error.
-//                  ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
 // typedef FNowhere<X extends num> = Function();
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:33:22: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:33:3: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 //  - 'Object' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<Object?> fArgumentObjectNullable; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:34:22: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:34:3: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<dynamic> fArgumentDynamic; // Error.
-//                      ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/issue42429.dart:35:19: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// pkg/front_end/testcases/nnbd/issue42429.dart:35:3: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
 // Try changing type arguments so that they conform to the bounds.
 //   FArgument<void> fArgumentVoid; // Error.
-//                   ^
+//   ^
 // pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef FArgument<X extends num> = Function(X);
 //                   ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect
index e263ad8..1495f43 100644
--- a/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect
index e263ad8..1495f43 100644
--- a/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect
index e263ad8..1495f43 100644
--- a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect
index e263ad8..1495f43 100644
--- a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.outline.expect
index 46e4efc..ec07cf7 100644
--- a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.outline.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect
index e263ad8..1495f43 100644
--- a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.transformed.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect
index 88588f6..a478b42 100644
--- a/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends B<X>> = Function();
 //           ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect
index 88588f6..a478b42 100644
--- a/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends B<X>> = Function();
 //           ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect
index 88588f6..a478b42 100644
--- a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends B<X>> = Function();
 //           ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect
index 88588f6..a478b42 100644
--- a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends B<X>> = Function();
 //           ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.outline.expect
index d314070..7167cc7 100644
--- a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.outline.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends B<X>> = Function();
 //           ^
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect
index 88588f6..a478b42 100644
--- a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.transformed.expect
@@ -2,13 +2,13 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:41: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // typedef AAlias<X> = Function<X1 extends A<X>> ();
-//                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends B<X>> = Function();
 //           ^
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
index 46f6782..c89209d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:41: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
-//                                                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
+//                                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
+//                                          ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
@@ -38,158 +38,158 @@
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:36: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                    ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:44: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                            ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                          ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:40: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class B<X extends A<Null>?> implements A<X> {
-//       ^
+//                                        ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                         ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                                        ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:22: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.redirect(A<A<Null>>? a) = C.internal;
-//                                  ^
+//                      ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:18: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.fact(A<A<Null>>? a) {
-//                              ^
+//                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:5: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? b;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? c;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? a;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? b;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
index 46f6782..c89209d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:41: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
-//                                                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
+//                                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
+//                                          ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
@@ -38,158 +38,158 @@
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:36: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                    ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:44: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                            ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                          ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:40: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class B<X extends A<Null>?> implements A<X> {
-//       ^
+//                                        ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                         ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                                        ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:22: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.redirect(A<A<Null>>? a) = C.internal;
-//                                  ^
+//                      ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:18: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.fact(A<A<Null>>? a) {
-//                              ^
+//                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:5: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? b;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? c;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? a;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? b;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
index 46f6782..c89209d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:41: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
-//                                                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
+//                                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
+//                                          ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
@@ -38,158 +38,158 @@
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:36: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                    ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:44: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                            ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                          ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:40: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class B<X extends A<Null>?> implements A<X> {
-//       ^
+//                                        ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                         ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                                        ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:22: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.redirect(A<A<Null>>? a) = C.internal;
-//                                  ^
+//                      ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:18: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.fact(A<A<Null>>? a) {
-//                              ^
+//                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:5: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? b;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? c;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? a;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? b;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect
index 46f6782..c89209d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:41: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
-//                                                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
+//                                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
+//                                          ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
@@ -38,158 +38,158 @@
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:36: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                    ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:44: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                            ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                          ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:40: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class B<X extends A<Null>?> implements A<X> {
-//       ^
+//                                        ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                         ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                                        ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:22: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.redirect(A<A<Null>>? a) = C.internal;
-//                                  ^
+//                      ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:18: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.fact(A<A<Null>>? a) {
-//                              ^
+//                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:5: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? b;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? c;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? a;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? b;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
index ffca4b4..07d69b7 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.outline.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:41: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
-//                                                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
+//                                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
+//                                          ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
@@ -38,65 +38,65 @@
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:36: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                    ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:44: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                            ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                          ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:40: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class B<X extends A<Null>?> implements A<X> {
-//       ^
+//                                        ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                         ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                                        ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:22: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.redirect(A<A<Null>>? a) = C.internal;
-//                                  ^
+//                      ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:18: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.fact(A<A<Null>>? a) {
-//                              ^
+//                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
index 46f6782..c89209d 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -2,27 +2,27 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:41: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
-//                                                     ^
+//                                         ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
+//                                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
+//                                          ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
@@ -38,158 +38,158 @@
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:36: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                    ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:44: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                            ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:34: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:42: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                          ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:40: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
 //  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 //  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class B<X extends A<Null>?> implements A<X> {
-//       ^
+//                                        ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                         ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
-//                                                        ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
-// class A<X extends A<X>?> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                       ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
-// Try changing type arguments so that they conform to the bounds.
-//   void method2<Y extends String>(D<Y> a, D<String>? b) {
-//                                                     ^
-// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
-// class D<X extends num> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:22: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.redirect(A<A<Null>>? a) = C.internal;
-//                                  ^
+//                      ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:18: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   factory C.fact(A<A<Null>>? a) {
-//                              ^
+//                  ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:5: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? d;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:5: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<Y>? c;
-//           ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? d;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? b;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? c;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:5: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //     A<A<Null>>? a;
-//                 ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends A<X>?> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:5: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
 // Try changing type arguments so that they conform to the bounds.
 //     D<String>? b;
-//                ^
+//     ^
 // pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
 // class D<X extends num> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
index d0065b3..4c7be00 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:19: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
 // Try changing type arguments so that they conform to the bounds.
 // class A<X extends F<X>> {}
-//         ^
+//                   ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<Y extends num> = Y Function();
 //           ^
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:20: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
 // Try changing type arguments so that they conform to the bounds.
 // class A2<X extends F2<X>> {}
-//          ^
+//                    ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
 // typedef F2<Y extends num> = Y Function();
 //            ^
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
index d0065b3..4c7be00 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:19: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
 // Try changing type arguments so that they conform to the bounds.
 // class A<X extends F<X>> {}
-//         ^
+//                   ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<Y extends num> = Y Function();
 //           ^
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:20: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
 // Try changing type arguments so that they conform to the bounds.
 // class A2<X extends F2<X>> {}
-//          ^
+//                    ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
 // typedef F2<Y extends num> = Y Function();
 //            ^
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
index d0065b3..4c7be00 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:19: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
 // Try changing type arguments so that they conform to the bounds.
 // class A<X extends F<X>> {}
-//         ^
+//                   ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<Y extends num> = Y Function();
 //           ^
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:20: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
 // Try changing type arguments so that they conform to the bounds.
 // class A2<X extends F2<X>> {}
-//          ^
+//                    ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
 // typedef F2<Y extends num> = Y Function();
 //            ^
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect
index d0065b3..4c7be00 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:19: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
 // Try changing type arguments so that they conform to the bounds.
 // class A<X extends F<X>> {}
-//         ^
+//                   ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<Y extends num> = Y Function();
 //           ^
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:20: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
 // Try changing type arguments so that they conform to the bounds.
 // class A2<X extends F2<X>> {}
-//          ^
+//                    ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
 // typedef F2<Y extends num> = Y Function();
 //            ^
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect
index 5fc32cd..2f4ff7f 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.outline.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:19: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
 // Try changing type arguments so that they conform to the bounds.
 // class A<X extends F<X>> {}
-//         ^
+//                   ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<Y extends num> = Y Function();
 //           ^
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:20: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
 // Try changing type arguments so that they conform to the bounds.
 // class A2<X extends F2<X>> {}
-//          ^
+//                    ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
 // typedef F2<Y extends num> = Y Function();
 //            ^
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
index d0065b3..4c7be00 100644
--- a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.transformed.expect
@@ -2,18 +2,18 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:19: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
 // Try changing type arguments so that they conform to the bounds.
 // class A<X extends F<X>> {}
-//         ^
+//                   ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<Y extends num> = Y Function();
 //           ^
 //
-// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:20: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
 // Try changing type arguments so that they conform to the bounds.
 // class A2<X extends F2<X>> {}
-//          ^
+//                    ^
 // pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
 // typedef F2<Y extends num> = Y Function();
 //            ^
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect
index 5537cc3..8b88b00 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.expect
@@ -18,455 +18,425 @@
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo1b(F x) {}
-//         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1b(F x) {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F foo4b() => throw 42;
-//        ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F foo4b() => throw 42;
-//        ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo7b([F? x]) {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7b([F? x]) {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// bar1(B<num> x) {}
-//             ^
+// bar2<X extends B<num>>() {}
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// bar2<X extends B<num>>() {}
+// class Bar3<X extends B<num>> {}
+//                      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// F foo4b() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
 //      ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar3<X extends B<num>> {}
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:1: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // B<num> bar4() => throw 42;
-//            ^
+// ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar5({required B<num> x}) {}
-//                       ^
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar7([B<num>? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar8 extends B<dynamic> {}
 //       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:20: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F x;
-//     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F x;
-//     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F x in []) {}
-//          ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//          ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo1(F x) {}
-//             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F x) {}
-//             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo2<X extends F>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F fooFoo4() => throw 42;
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F fooFoo4() => throw 42;
-//            ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo5({required F x}) {}
-//                       ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F x}) {}
-//                       ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo7([F? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F? x]) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<num> x;
-//          ^
+// class Bar8 extends B<dynamic> {}
+//                    ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo1(F x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo2<X extends F>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo5({required F x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo7([F? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F? x]) {}
+//            ^
 //
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:72:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
@@ -476,50 +446,58 @@
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:20: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> x;
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:8: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar1(B<num> x) {}
-//                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   barBar2<X extends B<num>>() {}
 //           ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar2<X extends B<num>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   B<num> barBar4() => throw 42;
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:28: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar5({required B<num> x}) {}
-//                            ^
+//                     ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:20: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar7([B<num>? x]) {}
-//                    ^
+//            ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect
index c007963..96f0d73 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.strong.transformed.expect
@@ -18,455 +18,425 @@
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo1b(F x) {}
-//         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1b(F x) {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F foo4b() => throw 42;
-//        ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F foo4b() => throw 42;
-//        ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo7b([F? x]) {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7b([F? x]) {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// bar1(B<num> x) {}
-//             ^
+// bar2<X extends B<num>>() {}
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// bar2<X extends B<num>>() {}
+// class Bar3<X extends B<num>> {}
+//                      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// F foo4b() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
 //      ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar3<X extends B<num>> {}
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:1: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // B<num> bar4() => throw 42;
-//            ^
+// ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar5({required B<num> x}) {}
-//                       ^
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar7([B<num>? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar8 extends B<dynamic> {}
 //       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:20: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F x;
-//     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F x;
-//     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F x in []) {}
-//          ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//          ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo1(F x) {}
-//             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F x) {}
-//             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo2<X extends F>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F fooFoo4() => throw 42;
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F fooFoo4() => throw 42;
-//            ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo5({required F x}) {}
-//                       ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F x}) {}
-//                       ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo7([F? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F? x]) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<num> x;
-//          ^
+// class Bar8 extends B<dynamic> {}
+//                    ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo1(F x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo2<X extends F>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo5({required F x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo7([F? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F? x]) {}
+//            ^
 //
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:72:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
@@ -476,50 +446,58 @@
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:20: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> x;
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:8: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar1(B<num> x) {}
-//                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   barBar2<X extends B<num>>() {}
 //           ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar2<X extends B<num>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   B<num> barBar4() => throw 42;
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:28: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar5({required B<num> x}) {}
-//                            ^
+//                     ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:20: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar7([B<num>? x]) {}
-//                    ^
+//            ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect
index 5537cc3..8b88b00 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.expect
@@ -18,455 +18,425 @@
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo1b(F x) {}
-//         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1b(F x) {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F foo4b() => throw 42;
-//        ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F foo4b() => throw 42;
-//        ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo7b([F? x]) {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7b([F? x]) {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// bar1(B<num> x) {}
-//             ^
+// bar2<X extends B<num>>() {}
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// bar2<X extends B<num>>() {}
+// class Bar3<X extends B<num>> {}
+//                      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// F foo4b() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
 //      ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar3<X extends B<num>> {}
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:1: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // B<num> bar4() => throw 42;
-//            ^
+// ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar5({required B<num> x}) {}
-//                       ^
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar7([B<num>? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar8 extends B<dynamic> {}
 //       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:20: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F x;
-//     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F x;
-//     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F x in []) {}
-//          ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//          ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo1(F x) {}
-//             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F x) {}
-//             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo2<X extends F>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F fooFoo4() => throw 42;
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F fooFoo4() => throw 42;
-//            ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo5({required F x}) {}
-//                       ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F x}) {}
-//                       ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo7([F? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F? x]) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<num> x;
-//          ^
+// class Bar8 extends B<dynamic> {}
+//                    ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo1(F x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo2<X extends F>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo5({required F x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo7([F? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F? x]) {}
+//            ^
 //
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:72:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
@@ -476,50 +446,58 @@
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:20: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> x;
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:8: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar1(B<num> x) {}
-//                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   barBar2<X extends B<num>>() {}
 //           ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar2<X extends B<num>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   B<num> barBar4() => throw 42;
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:28: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar5({required B<num> x}) {}
-//                            ^
+//                     ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:20: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar7([B<num>? x]) {}
-//                    ^
+//            ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect
index 5537cc3..8b88b00 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect
@@ -18,455 +18,425 @@
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo1b(F x) {}
-//         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1b(F x) {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F foo4b() => throw 42;
-//        ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F foo4b() => throw 42;
-//        ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo7b([F? x]) {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7b([F? x]) {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// bar1(B<num> x) {}
-//             ^
+// bar2<X extends B<num>>() {}
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// bar2<X extends B<num>>() {}
+// class Bar3<X extends B<num>> {}
+//                      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// F foo4b() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
 //      ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar3<X extends B<num>> {}
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:1: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // B<num> bar4() => throw 42;
-//            ^
+// ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar5({required B<num> x}) {}
-//                       ^
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar7([B<num>? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar8 extends B<dynamic> {}
 //       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:20: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F x;
-//     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F x;
-//     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F x in []) {}
-//          ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//          ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo1(F x) {}
-//             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F x) {}
-//             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo2<X extends F>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F fooFoo4() => throw 42;
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F fooFoo4() => throw 42;
-//            ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo5({required F x}) {}
-//                       ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F x}) {}
-//                       ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo7([F? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F? x]) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<num> x;
-//          ^
+// class Bar8 extends B<dynamic> {}
+//                    ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo1(F x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo2<X extends F>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo5({required F x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo7([F? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F? x]) {}
+//            ^
 //
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:72:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
@@ -476,50 +446,58 @@
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:20: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> x;
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:8: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar1(B<num> x) {}
-//                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   barBar2<X extends B<num>>() {}
 //           ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar2<X extends B<num>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   B<num> barBar4() => throw 42;
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:28: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar5({required B<num> x}) {}
-//                            ^
+//                     ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:20: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar7([B<num>? x]) {}
-//                    ^
+//            ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect
index 155fe0cd..b4f6b22 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.outline.expect
@@ -18,212 +18,226 @@
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo1b(F x) {}
-//         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1b(F x) {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F foo4b() => throw 42;
-//        ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F foo4b() => throw 42;
-//        ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo7b([F? x]) {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7b([F? x]) {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// bar1(B<num> x) {}
-//             ^
+// bar2<X extends B<num>>() {}
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// bar2<X extends B<num>>() {}
+// class Bar3<X extends B<num>> {}
+//                      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// F foo4b() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
 //      ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar3<X extends B<num>> {}
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:1: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // B<num> bar4() => throw 42;
-//            ^
+// ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar5({required B<num> x}) {}
-//                       ^
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar7([B<num>? x]) {}
-//               ^
+//       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:20: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // class Bar8 extends B<dynamic> {}
-//       ^
+//                    ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect
index c007963..96f0d73 100644
--- a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.transformed.expect
@@ -18,455 +18,425 @@
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1a(F<A<dynamic>, A<Never>> x) {}
-//                               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo1b(F x) {}
-//         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo1b(F x) {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2a<X extends F<A<dynamic>, A<Never>>>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // foo2b<X extends F>() {}
-//       ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
 // class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
-//             ^
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F<A<dynamic>, A<Never>> foo4a() => throw 42;
-//                              ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// F foo4b() => throw 42;
-//        ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// F foo4b() => throw 42;
-//        ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo5a({required F<A<dynamic>, A<Never>> x}) {}
-//                                         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
 //           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 //  - 'Object' is from 'dart:core'.
-// foo5b({required F x}) {}
-//                   ^
+// class Foo3b<X extends F> {}
+//                       ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7a([F<A<dynamic>, A<Never>>? x]) {}
-//                                 ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-// foo7b([F? x]) {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-// foo7b([F? x]) {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// bar1(B<num> x) {}
-//             ^
+// bar2<X extends B<num>>() {}
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// bar2<X extends B<num>>() {}
+// class Bar3<X extends B<num>> {}
+//                      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// F foo4b() => throw 42;
+// ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:1: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+// ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:17: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:8: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
 //      ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar3<X extends B<num>> {}
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:1: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // B<num> bar4() => throw 42;
-//            ^
+// ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar5({required B<num> x}) {}
-//                       ^
+//                ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:7: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 // bar7([B<num>? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
-// Try changing type arguments so that they conform to the bounds.
-// class Bar8 extends B<dynamic> {}
 //       ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:20: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> x;
-//                           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F<A<dynamic>, A<Never>> x in []) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
-//                                   ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
-//                                  ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
-//                                             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
-//                                     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F x;
-//     ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F x;
-//     ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   for (F x in []) {}
-//          ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//          ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (F x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   for (F x in []) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo1(F x) {}
-//             ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo1(F x) {}
-//             ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo2<X extends F>() {}
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo2<X extends F>() {}
-//           ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try changing type arguments so that they conform to the bounds.
-//   F fooFoo4() => throw 42;
-//            ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   F fooFoo4() => throw 42;
-//            ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo5({required F x}) {}
-//                       ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo5({required F x}) {}
-//                       ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   fooFoo7([F? x]) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
-// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
-//           ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
-//  - 'Object' is from 'dart:core'.
-//   fooFoo7([F? x]) {}
-//               ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   B<num> x;
-//          ^
+// class Bar8 extends B<dynamic> {}
+//                    ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
 // Try changing type arguments so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//               ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F x;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F x;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo1(F x) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F x) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo2<X extends F>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F>() {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   F fooFoo4() => throw 42;
+//   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:3: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F fooFoo4() => throw 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo5({required F x}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:21: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F x}) {}
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo7([F? x]) {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:12: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F? x]) {}
+//            ^
 //
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:72:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
@@ -476,50 +446,58 @@
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:20: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try specifying type arguments explicitly so that they conform to the bounds.
-//   for (B<num> x in []) {}
-//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> x;
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:8: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar1(B<num> x) {}
-//                  ^
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
-// class B<X extends int> {}
-//         ^
-//
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
-// Try changing type arguments so that they conform to the bounds.
-//   barBar2<X extends B<num>>() {}
 //           ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar2<X extends B<num>>() {}
+//                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:3: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   B<num> barBar4() => throw 42;
-//                 ^
+//   ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:28: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar5({required B<num> x}) {}
-//                            ^
+//                     ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:20: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
 // Try changing type arguments so that they conform to the bounds.
 //   barBar7([B<num>? x]) {}
-//                    ^
+//            ^
 // pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<X extends int> {}
 //         ^
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart
new file mode 100644
index 0000000..cb14757
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+method1(Class1 c1a, List<Class1> c1b, Class2 c2a, List<Class2> c2b) {}
+method2(Typedef1 t1a, List<Typedef1> t1b, Typedef2 t2a, List<Typedef2> t2b) {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.textual_outline.expect
new file mode 100644
index 0000000..5353363
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+// @dart = 2.9
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+method1(Class1 c1a, List<Class1> c1b, Class2 c2a, List<Class2> c2b) {}
+method2(Typedef1 t1a, List<Typedef1> t1b, Typedef2 t2a, List<Typedef2> t2b) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..914bd7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+// @dart = 2.9
+import 'main_lib1.dart';
+import 'main_lib2.dart';
+
+main() {}
+method1(Class1 c1a, List<Class1> c1b, Class2 c2a, List<Class2> c2b) {}
+method2(Typedef1 t1a, List<Typedef1> t1b, Typedef2 t2a, List<Typedef2> t2b) {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.expect
new file mode 100644
index 0000000..52f6f7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+static method method1(mai::Class1<core::Object>* c1a, core::List<mai::Class1<core::Object>*>* c1b, mai2::Class2<core::Object>* c2a, core::List<mai2::Class2<core::Object>*>* c2b) → dynamic {}
+static method method2(mai::Class1<core::int*>* t1a, core::List<mai::Class1<core::int*>*>* t1b, mai2::Class2<core::int*>* t2a, core::List<mai2::Class2<core::int*>*>* t2b) → dynamic {}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+typedef Typedef1<T extends core::int> = mai::Class1<T>;
+class Class1<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai::Class1<mai::Class1::T>
+    : super core::Object::•()
+    ;
+}
+static method _#Typedef1#new#tearOff<T extends core::int>() → mai::Class1<mai::_#Typedef1#new#tearOff::T>
+  return new mai::Class1::•<mai::_#Typedef1#new#tearOff::T>();
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef2<T extends core::int> = mai2::Class2<T>;
+class Class2<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai2::Class2<mai2::Class2::T>
+    : super core::Object::•()
+    ;
+}
+static method _#Typedef2#new#tearOff<T extends core::int>() → mai2::Class2<mai2::_#Typedef2#new#tearOff::T>
+  return new mai2::Class2::•<mai2::_#Typedef2#new#tearOff::T>();
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.modular.expect
new file mode 100644
index 0000000..8313d94
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+static method method1(mai::Class1<core::Object>* c1a, core::List<mai::Class1<core::Object>*>* c1b, mai2::Class2<core::Object>* c2a, core::List<mai2::Class2<core::Object>*>* c2b) → dynamic {}
+static method method2(mai::Class1<core::int*>* t1a, core::List<mai::Class1<core::int*>*>* t1b, mai2::Class2<core::int*>* t2a, core::List<mai2::Class2<core::int*>*>* t2b) → dynamic {}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+typedef Typedef1<T extends core::int> = mai::Class1<T>;
+class Class1<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai::Class1<mai::Class1::T>
+    : super core::Object::•()
+    ;
+}
+static method _#Typedef1#new#tearOff<T extends core::int>() → mai::Class1<mai::_#Typedef1#new#tearOff::T>
+  return new mai::Class1::•<mai::_#Typedef1#new#tearOff::T>();
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.outline.expect
new file mode 100644
index 0000000..357068b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.outline.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+static method method1(mai::Class1<core::Object>* c1a, core::List<mai::Class1<core::Object>*>* c1b, mai2::Class2<core::Object>* c2a, core::List<mai2::Class2<core::Object>*>* c2b) → dynamic
+  ;
+static method method2(mai::Class1<core::int*>* t1a, core::List<mai::Class1<core::int*>*>* t1b, mai2::Class2<core::int*>* t2a, core::List<mai2::Class2<core::int*>*>* t2b) → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+typedef Typedef1<T extends core::int> = mai::Class1<T>;
+class Class1<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai::Class1<mai::Class1::T>
+    ;
+}
+static method _#Typedef1#new#tearOff<T extends core::int>() → mai::Class1<mai::_#Typedef1#new#tearOff::T>
+  return new mai::Class1::•<mai::_#Typedef1#new#tearOff::T>();
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef2<T extends core::int> = mai2::Class2<T>;
+class Class2<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai2::Class2<mai2::Class2::T>
+    ;
+}
+static method _#Typedef2#new#tearOff<T extends core::int>() → mai2::Class2<mai2::_#Typedef2#new#tearOff::T>
+  return new mai2::Class2::•<mai2::_#Typedef2#new#tearOff::T>();
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..52f6f7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+static method method1(mai::Class1<core::Object>* c1a, core::List<mai::Class1<core::Object>*>* c1b, mai2::Class2<core::Object>* c2a, core::List<mai2::Class2<core::Object>*>* c2b) → dynamic {}
+static method method2(mai::Class1<core::int*>* t1a, core::List<mai::Class1<core::int*>*>* t1b, mai2::Class2<core::int*>* t2a, core::List<mai2::Class2<core::int*>*>* t2b) → dynamic {}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+typedef Typedef1<T extends core::int> = mai::Class1<T>;
+class Class1<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai::Class1<mai::Class1::T>
+    : super core::Object::•()
+    ;
+}
+static method _#Typedef1#new#tearOff<T extends core::int>() → mai::Class1<mai::_#Typedef1#new#tearOff::T>
+  return new mai::Class1::•<mai::_#Typedef1#new#tearOff::T>();
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef2<T extends core::int> = mai2::Class2<T>;
+class Class2<T extends core::Object> extends core::Object {
+  synthetic constructor •() → mai2::Class2<mai2::Class2::T>
+    : super core::Object::•()
+    ;
+}
+static method _#Typedef2#new#tearOff<T extends core::int>() → mai2::Class2<mai2::_#Typedef2#new#tearOff::T>
+  return new mai2::Class2::•<mai2::_#Typedef2#new#tearOff::T>();
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main_lib1.dart b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main_lib1.dart
new file mode 100644
index 0000000..56b8028
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main_lib1.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class1<T extends Object> {}
+
+typedef Typedef1<T extends int> = Class1<T>;
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main_lib2.dart b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main_lib2.dart
new file mode 100644
index 0000000..6ec94dd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/main_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class2<T extends Object> {}
+
+typedef Typedef2<T extends int> = Class2<T>;
diff --git a/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/test.options b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/test.options
new file mode 100644
index 0000000..8400751
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/default_type_from_opt_in/test.options
@@ -0,0 +1 @@
+main_lib2.dart
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
index 6bf247e..6ff4604 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect
index 864208b..9067a8a 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect
index 7f83539..8bb74bf 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.outline.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
index 2a72e6a..336a50e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
index 6bf247e..6ff4604 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect
index 6bf247e..6ff4604 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect
index 7f83539..8bb74bf 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.outline.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
index 2a72e6a..336a50e 100644
--- a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.transformed.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 import "main_lib1.dart" as mai;
-import "main_lib2.dart" as mai2;
 
 import "org-dartlang-testcase:///main_lib1.dart";
 import "org-dartlang-testcase:///main_lib2.dart";
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.expect
index 1722631..929831e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'C<dynamic> Function(C<dynamic>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'G<C<dynamic>>' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   A a = throw 42; // Error.
@@ -10,11 +10,23 @@
 // pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends G<C<X>>> = C<X>;
 //           ^
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<C<dynamic> Function(C<dynamic>)>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<G<C<dynamic>>>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 //   A a = throw 42; // Error.
 //   ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Error: Inferred type argument 'H<dynamic>' doesn't conform to the bound 'C<X Function(X)>' of the type variable 'X' on 'B'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B b = throw 42; // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends H<X>> = C<X>;
+//           ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Context: If you want 'B<H<dynamic>>' to be a super-bounded type, note that the inverted type 'B<H<Never>>' must then satisfy its bounds, which it does not.
+//   B b = throw 42; // Error.
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.transformed.expect
index 1722631..929831e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'C<dynamic> Function(C<dynamic>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'G<C<dynamic>>' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   A a = throw 42; // Error.
@@ -10,11 +10,23 @@
 // pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends G<C<X>>> = C<X>;
 //           ^
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<C<dynamic> Function(C<dynamic>)>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<G<C<dynamic>>>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 //   A a = throw 42; // Error.
 //   ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Error: Inferred type argument 'H<dynamic>' doesn't conform to the bound 'C<X Function(X)>' of the type variable 'X' on 'B'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B b = throw 42; // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends H<X>> = C<X>;
+//           ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Context: If you want 'B<H<dynamic>>' to be a super-bounded type, note that the inverted type 'B<H<Never>>' must then satisfy its bounds, which it does not.
+//   B b = throw 42; // Error.
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.expect
index 1722631..929831e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'C<dynamic> Function(C<dynamic>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'G<C<dynamic>>' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   A a = throw 42; // Error.
@@ -10,11 +10,23 @@
 // pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends G<C<X>>> = C<X>;
 //           ^
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<C<dynamic> Function(C<dynamic>)>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<G<C<dynamic>>>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 //   A a = throw 42; // Error.
 //   ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Error: Inferred type argument 'H<dynamic>' doesn't conform to the bound 'C<X Function(X)>' of the type variable 'X' on 'B'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B b = throw 42; // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends H<X>> = C<X>;
+//           ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Context: If you want 'B<H<dynamic>>' to be a super-bounded type, note that the inverted type 'B<H<Never>>' must then satisfy its bounds, which it does not.
+//   B b = throw 42; // Error.
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect
index 1722631..929831e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'C<dynamic> Function(C<dynamic>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'G<C<dynamic>>' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   A a = throw 42; // Error.
@@ -10,11 +10,23 @@
 // pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends G<C<X>>> = C<X>;
 //           ^
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<C<dynamic> Function(C<dynamic>)>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<G<C<dynamic>>>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 //   A a = throw 42; // Error.
 //   ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Error: Inferred type argument 'H<dynamic>' doesn't conform to the bound 'C<X Function(X)>' of the type variable 'X' on 'B'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B b = throw 42; // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends H<X>> = C<X>;
+//           ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Context: If you want 'B<H<dynamic>>' to be a super-bounded type, note that the inverted type 'B<H<Never>>' must then satisfy its bounds, which it does not.
+//   B b = throw 42; // Error.
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.transformed.expect
index 1722631..929831e 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'C<dynamic> Function(C<dynamic>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Error: Inferred type argument 'G<C<dynamic>>' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   A a = throw 42; // Error.
@@ -10,11 +10,23 @@
 // pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
 // typedef A<X extends G<C<X>>> = C<X>;
 //           ^
-// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<C<dynamic> Function(C<dynamic>)>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:13:3: Context: If you want 'A<G<C<dynamic>>>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
 //  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
 //   A a = throw 42; // Error.
 //   ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Error: Inferred type argument 'H<dynamic>' doesn't conform to the bound 'C<X Function(X)>' of the type variable 'X' on 'B'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B b = throw 42; // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends H<X>> = C<X>;
+//           ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:14:3: Context: If you want 'B<H<dynamic>>' to be a super-bounded type, note that the inverted type 'B<H<Never>>' must then satisfy its bounds, which it does not.
+//   B b = throw 42; // Error.
+//   ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index a5ff68d..4e24ada 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -18,6 +18,7 @@
 extension_types/simple_show_hide: ExpectationFileMismatchSerialized # Expected.
 extension_types/type_variable_in_static_context: ExpectationFileMismatchSerialized # Expected.
 general/abstract_members: TypeCheckError
+general/bounds_type_parameters: TypeCheckError
 general/bug30695: TypeCheckError
 general/covariant_field: TypeCheckError
 general/crashes/crash_02/main: Crash
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 2a12a528..4025cef 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -34,6 +34,7 @@
 general/ambiguous_exports: RuntimeError
 general/await_in_non_async: RuntimeError
 general/bounded_implicit_instantiation: TypeCheckError
+general/bounds_instances: TypeCheckError
 general/bug30695: TypeCheckError
 general/bug31124: RuntimeError
 general/call: RuntimeError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 68ae6c1..50e8f90 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -124,6 +124,7 @@
 general/ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
 general/await_in_non_async: RuntimeError # Expected.
 general/bounded_implicit_instantiation: TypeCheckError
+general/bounds_instances: TypeCheckError
 general/bug30695: TypeCheckError
 general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
 general/call: RuntimeError
diff --git a/pkg/front_end/tool/ast_model.dart b/pkg/front_end/tool/ast_model.dart
index 9979dcb..4ae1aee 100644
--- a/pkg/front_end/tool/ast_model.dart
+++ b/pkg/front_end/tool/ast_model.dart
@@ -174,7 +174,6 @@
   },
   'FunctionType': {
     'typeParameters': FieldRule(isDeclaration: true),
-    '_typedefType': FieldRule(name: 'typedefType'),
   },
   'TypeParameterType': {
     'parameter': FieldRule(isDeclaration: false),
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index c962060..4499a08 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 79;
+  UInt32 formatVersion = 80;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -1463,7 +1463,6 @@
   UInt totalParameterCount;
   List<DartType> positionalParameters;
   List<NamedDartType> namedParameters;
-  Option<TypedefType> typedef;
   DartType returnType;
 }
 
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index f3f7728..78972bc 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -8752,8 +8752,7 @@
         type.positionalParameters, type.returnType, type.declaredNullability,
         namedParameters: type.namedParameters,
         typeParameters: freshTypeParameters.freshTypeParameters,
-        requiredParameterCount: type.requiredParameterCount,
-        typedefType: null);
+        requiredParameterCount: type.requiredParameterCount);
   }
 
   @override
@@ -11207,8 +11206,6 @@
   @override
   final Nullability declaredNullability;
 
-  TypedefType? _typedefType;
-
   final DartType returnType;
 
   @override
@@ -11218,27 +11215,10 @@
       this.declaredNullability,
       {this.namedParameters: const <NamedType>[],
       this.typeParameters: const <TypeParameter>[],
-      int? requiredParameterCount,
-      TypedefType? typedefType})
+      int? requiredParameterCount})
       : this.positionalParameters = positionalParameters,
         this.requiredParameterCount =
-            requiredParameterCount ?? positionalParameters.length,
-        _typedefType = typedefType;
-
-  Reference? get typedefReference => _typedefType?.typedefReference;
-
-  Typedef? get typedef => typedefReference?.asTypedef;
-
-  /// The [Typedef] this function type is created for, if any.
-  TypedefType? get typedefType => _typedefType;
-
-  void set typedefType(TypedefType? value) {
-    assert(
-        _typedefType == null,
-        "Cannot change an already set FunctionType.typedefType from "
-        "$_typedefType to $value.");
-    _typedefType = value;
-  }
+            requiredParameterCount ?? positionalParameters.length;
 
   @override
   Nullability get nullability => declaredNullability;
@@ -11255,7 +11235,6 @@
     visitList(typeParameters, v);
     visitList(positionalParameters, v);
     visitList(namedParameters, v);
-    typedefType?.accept(v);
     returnType.accept(v);
   }
 
@@ -11325,8 +11304,7 @@
     if (typeParameters.isEmpty) return this;
     return new FunctionType(positionalParameters, returnType, nullability,
         requiredParameterCount: requiredParameterCount,
-        namedParameters: namedParameters,
-        typedefType: null);
+        namedParameters: namedParameters);
   }
 
   /// Looks up the type of the named parameter with the given name.
@@ -11375,8 +11353,7 @@
         positionalParameters, returnType, declaredNullability,
         namedParameters: namedParameters,
         typeParameters: typeParameters,
-        requiredParameterCount: requiredParameterCount,
-        typedefType: typedefType?.withDeclaredNullability(declaredNullability));
+        requiredParameterCount: requiredParameterCount);
     if (typeParameters.isEmpty) return result;
     return getFreshTypeParameters(typeParameters).applyToFunctionType(result);
   }
@@ -13485,8 +13462,7 @@
         type.positionalParameters, type.returnType, type.declaredNullability,
         namedParameters: type.namedParameters,
         typeParameters: freshTypeParameters.freshTypeParameters,
-        requiredParameterCount: type.requiredParameterCount,
-        typedefType: null);
+        requiredParameterCount: type.requiredParameterCount);
   }
 }
 
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index bc9a385..9df6792 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -3089,7 +3089,6 @@
     int totalParameterCount = readUInt30();
     List<DartType> positional = readDartTypeList();
     List<NamedType> named = readNamedTypeList();
-    TypedefType? typedefType = readDartTypeOption() as TypedefType?;
     assert(positional.length + named.length == totalParameterCount);
     DartType returnType = readDartType();
     typeParameterStack.length = typeParameterStackHeight;
@@ -3097,8 +3096,7 @@
         positional, returnType, Nullability.values[nullabilityIndex],
         typeParameters: typeParameters,
         requiredParameterCount: requiredParameterCount,
-        namedParameters: named,
-        typedefType: typedefType);
+        namedParameters: named);
   }
 
   DartType _readSimpleFunctionType() {
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 3d18bb1..1f678e9 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -2390,8 +2390,7 @@
   void visitFunctionType(FunctionType node) {
     if (node.requiredParameterCount == node.positionalParameters.length &&
         node.typeParameters.isEmpty &&
-        node.namedParameters.isEmpty &&
-        node.typedefType == null) {
+        node.namedParameters.isEmpty) {
       writeByte(Tag.SimpleFunctionType);
       writeByte(node.nullability.index);
       writeNodeList(node.positionalParameters);
@@ -2406,7 +2405,6 @@
           node.positionalParameters.length + node.namedParameters.length);
       writeNodeList(node.positionalParameters);
       writeNodeList(node.namedParameters);
-      writeOptionalNode(node.typedefType);
       writeNode(node.returnType);
       leaveScope(typeParameters: node.typeParameters);
     }
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index f589ea5..aed4155 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -176,7 +176,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 79;
+  static const int BinaryFormatVersion = 80;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index e40aca5..884fe9d 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -284,16 +284,16 @@
   }
 }
 
-// Finds type arguments that don't follow the rules of well-boundness.
+// Finds type arguments that don't follow the rules of well-boundedness.
 //
 // [bottomType] should be either Null or Never, depending on what should be
 // taken for the bottom type at the call site.  The bottom type is used in the
-// checks for super-boundness for construction of the auxiliary type.  For
+// checks for super-boundedness for construction of the auxiliary type.  For
 // details see Dart Language Specification, Section 14.3.2 The Instantiation to
 // Bound Algorithm.
 List<TypeArgumentIssue> findTypeArgumentIssues(DartType type,
     TypeEnvironment typeEnvironment, SubtypeCheckMode subtypeCheckMode,
-    {bool allowSuperBounded = false,
+    {required bool allowSuperBounded,
     required bool isNonNullableByDefault,
     required bool areGenericArgumentsAllowed}) {
   // ignore: unnecessary_null_comparison
@@ -305,26 +305,6 @@
   List<DartType> arguments = const <DartType>[];
   List<TypeArgumentIssue> typedefRhsResult = const <TypeArgumentIssue>[];
 
-  if (type is FunctionType && type.typedefType != null) {
-    // [type] is a function type that is an application of a parametrized
-    // typedef.  We need to check both the l.h.s. and the r.h.s. of the
-    // definition in that case.  For details, see [link]
-    // (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md).
-    FunctionType functionType = type;
-    FunctionType cloned = new FunctionType(functionType.positionalParameters,
-        functionType.returnType, functionType.nullability,
-        namedParameters: functionType.namedParameters,
-        typeParameters: functionType.typeParameters,
-        requiredParameterCount: functionType.requiredParameterCount,
-        typedefType: null);
-    typedefRhsResult = findTypeArgumentIssues(
-        cloned, typeEnvironment, subtypeCheckMode,
-        allowSuperBounded: true,
-        isNonNullableByDefault: isNonNullableByDefault,
-        areGenericArgumentsAllowed: areGenericArgumentsAllowed);
-    type = functionType.typedefType!;
-  }
-
   if (type is InterfaceType) {
     variables = type.classNode.typeParameters;
     arguments = type.typeArguments;
@@ -334,14 +314,6 @@
   } else if (type is FunctionType) {
     List<TypeArgumentIssue> result = <TypeArgumentIssue>[];
 
-    for (TypeParameter parameter in type.typeParameters) {
-      result.addAll(findTypeArgumentIssues(
-          parameter.bound, typeEnvironment, subtypeCheckMode,
-          allowSuperBounded: true,
-          isNonNullableByDefault: isNonNullableByDefault,
-          areGenericArgumentsAllowed: areGenericArgumentsAllowed));
-    }
-
     for (DartType formal in type.positionalParameters) {
       result.addAll(findTypeArgumentIssues(
           formal, typeEnvironment, subtypeCheckMode,
@@ -401,12 +373,6 @@
       // The bound is InvalidType so it's not checked, because an error was
       // reported already at the time of the creation of InvalidType.
     }
-
-    argumentsResult.addAll(findTypeArgumentIssues(
-        argument, typeEnvironment, subtypeCheckMode,
-        allowSuperBounded: true,
-        isNonNullableByDefault: isNonNullableByDefault,
-        areGenericArgumentsAllowed: areGenericArgumentsAllowed));
   }
   result.addAll(argumentsResult);
   result.addAll(typedefRhsResult);
@@ -440,6 +406,8 @@
       new Map<TypeParameter, DartType>.fromIterables(variables, arguments);
   for (int i = 0; i < arguments.length; ++i) {
     DartType argument = arguments[i];
+    // TODO(johnniwinther): Should we check this even when generic functions
+    // as type arguments is allowed?
     if (isGenericFunctionTypeOrAlias(argument)) {
       // Generic function types aren't allowed as type arguments either.
       isCorrectSuperBounded = false;
@@ -517,12 +485,6 @@
         result.add(new TypeArgumentIssue(i, argument, parameters[i], null));
       }
     }
-
-    result.addAll(findTypeArgumentIssues(
-        argument, typeEnvironment, subtypeCheckMode,
-        allowSuperBounded: true,
-        isNonNullableByDefault: isNonNullableByDefault,
-        areGenericArgumentsAllowed: areGenericArgumentsAllowed));
   }
   return result;
 }
@@ -554,6 +516,7 @@
 class _SuperBoundedTypeInverter extends ReplacementVisitor {
   final TypeEnvironment typeEnvironment;
   final bool isNonNullableByDefault;
+  bool isOutermost = true;
 
   _SuperBoundedTypeInverter(this.typeEnvironment,
       {required this.isNonNullableByDefault})
@@ -629,6 +592,7 @@
 
   @override
   DartType? visitInterfaceType(InterfaceType node, int variance) {
+    isOutermost = false;
     // Check for Object-based top types.
     if (isTop(node) && flipTop(variance)) {
       return bottomType;
@@ -639,6 +603,7 @@
 
   @override
   DartType? visitFutureOrType(FutureOrType node, int variance) {
+    isOutermost = false;
     // Check FutureOr-based top types.
     if (isTop(node) && flipTop(variance)) {
       return bottomType;
@@ -679,10 +644,12 @@
 
   // TypedefTypes receive special treatment because the variance of their
   // arguments' positions depend on the opt-in status of the library.
-  // TODO(cstefantsova): Remove the method when the discrepancy between the
-  // NNBD modes is resolved.
   @override
   DartType? visitTypedefType(TypedefType node, int variance) {
+    if (!isNonNullableByDefault && !isOutermost) {
+      return node.unalias.accept1(this, variance);
+    }
+    isOutermost = false;
     Nullability? newNullability = visitNullability(node);
     List<DartType>? newTypeArguments = null;
     for (int i = 0; i < node.typeArguments.length; i++) {
@@ -706,13 +673,8 @@
 
   @override
   DartType? visitFunctionType(FunctionType node, int variance) {
-    // The variance of the Typedef parameters should be taken into account only
-    // when for the NNBD code.
-    if (node.typedefType != null && isNonNullableByDefault) {
-      return node.typedefType!.accept1(this, variance);
-    } else {
-      return super.visitFunctionType(node, variance);
-    }
+    isOutermost = false;
+    return super.visitFunctionType(node, variance);
   }
 }
 
@@ -887,3 +849,49 @@
   if (type is TypedefType) type = type.unalias;
   return type is FunctionType && type.typeParameters.isNotEmpty;
 }
+
+bool hasGenericFunctionTypeAsTypeArgument(DartType type) {
+  return type.accept1(
+      const _HasGenericFunctionTypeAsTypeArgumentVisitor(), false);
+}
+
+class _HasGenericFunctionTypeAsTypeArgumentVisitor
+    extends DartTypeVisitor1<bool, bool> {
+  const _HasGenericFunctionTypeAsTypeArgumentVisitor();
+
+  @override
+  bool defaultDartType(DartType node, bool isTypeArgument) => false;
+
+  @override
+  bool visitFunctionType(FunctionType node, bool isTypeArgument) {
+    if (isTypeArgument && node.typeParameters.isNotEmpty) {
+      return true;
+    }
+    // TODO(johnniwinther): Should deeply nested generic function types be
+    //  disallowed?
+    if (node.returnType.accept1(this, false)) return true;
+    for (DartType parameterType in node.positionalParameters) {
+      if (parameterType.accept1(this, false)) return true;
+    }
+    for (NamedType namedParameterType in node.namedParameters) {
+      if (namedParameterType.type.accept1(this, false)) return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitInterfaceType(InterfaceType node, bool isTypeArgument) {
+    for (DartType typeArgument in node.typeArguments) {
+      if (typeArgument.accept1(this, true)) return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitTypedefType(TypedefType node, bool isTypeArgument) {
+    for (DartType typeArgument in node.typeArguments) {
+      if (typeArgument.accept1(this, true)) return true;
+    }
+    return false;
+  }
+}
diff --git a/pkg/kernel/lib/src/dart_type_equivalence.dart b/pkg/kernel/lib/src/dart_type_equivalence.dart
index aeea30f..18a2081 100644
--- a/pkg/kernel/lib/src/dart_type_equivalence.dart
+++ b/pkg/kernel/lib/src/dart_type_equivalence.dart
@@ -44,47 +44,6 @@
         return false;
       }
 
-      // If the two types are un-aliased typedef instantiations, check that
-      // those instantiations are equal as well.
-      bool nodeIsUnaliased = node.typedefType != null;
-      bool otherIsUnaliased = other.typedefType != null;
-      if (nodeIsUnaliased != otherIsUnaliased) {
-        return false;
-      }
-      if (node.typedefType != null) {
-        // The assert below checks the implication: if the typedef types are
-        // equal, their un-aliased types are equal as well.  The reverse is not
-        // true due to possibly unused type parameters F<int> and F<String> may
-        // be equal when un-aliased if the type parameter of typedef F isn't
-        // used on the right-hand side of the definition of F.  The checked
-        // proposition in the assert allows to skip checking the function types
-        // themselves if the typedef types are equal.
-        assert(() {
-          DartTypeEquivalence copy = this.copy();
-          if (!copy.areEqual(node.typedefType!, other.typedefType!)) {
-            return true;
-          }
-          FunctionType nodeWithoutTypedefType = new FunctionType(
-              node.positionalParameters,
-              node.returnType,
-              node.declaredNullability,
-              namedParameters: node.namedParameters,
-              typeParameters: node.typeParameters,
-              requiredParameterCount: node.requiredParameterCount,
-              typedefType: null);
-          FunctionType otherWithoutTypedefType = new FunctionType(
-              other.positionalParameters,
-              other.returnType,
-              other.declaredNullability,
-              namedParameters: other.namedParameters,
-              typeParameters: other.typeParameters,
-              requiredParameterCount: other.requiredParameterCount,
-              typedefType: null);
-          return copy.areEqual(nodeWithoutTypedefType, otherWithoutTypedefType);
-        }());
-        return node.typedefType!.accept1(this, other.typedefType);
-      }
-
       // Perform simple number checks before the checks on parts.
       if (node.typeParameters.length != other.typeParameters.length) {
         return false;
diff --git a/pkg/kernel/lib/src/equivalence.dart b/pkg/kernel/lib/src/equivalence.dart
index 3f11abc..840f85b 100644
--- a/pkg/kernel/lib/src/equivalence.dart
+++ b/pkg/kernel/lib/src/equivalence.dart
@@ -4074,9 +4074,6 @@
     if (!checkFunctionType_declaredNullability(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
-    if (!checkFunctionType_typedefType(visitor, node, other)) {
-      result = visitor.resultOnInequivalence;
-    }
     if (!checkFunctionType_returnType(visitor, node, other)) {
       result = visitor.resultOnInequivalence;
     }
@@ -7122,12 +7119,6 @@
         other.declaredNullability, 'declaredNullability');
   }
 
-  bool checkFunctionType_typedefType(
-      EquivalenceVisitor visitor, FunctionType node, FunctionType other) {
-    return visitor.checkNodes(
-        node.typedefType, other.typedefType, 'typedefType');
-  }
-
   bool checkFunctionType_returnType(
       EquivalenceVisitor visitor, FunctionType node, FunctionType other) {
     return visitor.checkNodes(node.returnType, other.returnType, 'returnType');
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index fe27f5c..58e18fa 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -116,19 +116,10 @@
       }
       newNamedParameters[i] = newNamedType;
     }
-    TypedefType? newTypedefType;
-    if (a.typedefType != null && b.typedefType != null) {
-      newTypedefType =
-          mergeTypes(a.typedefType!, b.typedefType!) as TypedefType?;
-      // If the typedef couldn't be merged we just omit it from the resulting
-      // function type since the typedef type is only informational.
-    }
-
     return new FunctionType(newPositionalParameters, newReturnType, nullability,
         namedParameters: newNamedParameters,
         typeParameters: newTypeParameters,
-        requiredParameterCount: a.requiredParameterCount,
-        typedefType: newTypedefType);
+        requiredParameterCount: a.requiredParameterCount);
   }
 
   NamedType? mergeNamedTypes(NamedType a, NamedType b, DartType newType) {
diff --git a/pkg/kernel/lib/src/replacement_visitor.dart b/pkg/kernel/lib/src/replacement_visitor.dart
index 2f625b4..5a60355 100644
--- a/pkg/kernel/lib/src/replacement_visitor.dart
+++ b/pkg/kernel/lib/src/replacement_visitor.dart
@@ -83,17 +83,9 @@
         newNamedParameters[i] = newNamedType;
       }
     }
-    TypedefType? newTypedefType =
-        visitType(node.typedefType, variance) as TypedefType?;
 
-    return createFunctionType(
-        node,
-        newNullability,
-        newTypeParameters,
-        newReturnType,
-        newPositionalParameters,
-        newNamedParameters,
-        newTypedefType);
+    return createFunctionType(node, newNullability, newTypeParameters,
+        newReturnType, newPositionalParameters, newNamedParameters);
   }
 
   NamedType? createNamedType(NamedType node, DartType? newType) {
@@ -110,13 +102,11 @@
       List<TypeParameter>? newTypeParameters,
       DartType? newReturnType,
       List<DartType>? newPositionalParameters,
-      List<NamedType>? newNamedParameters,
-      TypedefType? newTypedefType) {
+      List<NamedType>? newNamedParameters) {
     if (newNullability == null &&
         newReturnType == null &&
         newPositionalParameters == null &&
-        newNamedParameters == null &&
-        newTypedefType == null) {
+        newNamedParameters == null) {
       // No nullability or types had to be substituted.
       return null;
     } else {
@@ -126,8 +116,7 @@
           newNullability ?? node.nullability,
           namedParameters: newNamedParameters ?? node.namedParameters,
           typeParameters: newTypeParameters ?? node.typeParameters,
-          requiredParameterCount: node.requiredParameterCount,
-          typedefType: newTypedefType ?? node.typedefType);
+          requiredParameterCount: node.requiredParameterCount);
     }
   }
 
diff --git a/pkg/kernel/lib/src/unaliasing.dart b/pkg/kernel/lib/src/unaliasing.dart
new file mode 100644
index 0000000..107c696
--- /dev/null
+++ b/pkg/kernel/lib/src/unaliasing.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'package:kernel/type_algebra.dart';
+
+import '../ast.dart';
+import 'legacy_erasure.dart';
+import 'replacement_visitor.dart';
+
+/// Replaces all occurrences of [TypedefType] in [type] with the corresponding
+/// unaliased type.
+///
+/// If [legacyEraseAliases] is `true`, the unaliased types will be legacy
+/// erased. This used when the [TypedefType] was used in a legacy library.
+DartType unalias(DartType type, {required bool legacyEraseAliases}) {
+  return rawUnalias(type, legacyEraseAliases: legacyEraseAliases) ?? type;
+}
+
+/// Replaces all occurrences of [TypedefType] in [types] with the corresponding
+/// unaliased types.
+///
+/// If [legacyEraseAliases] is `true`, the unaliased types will be legacy
+/// erased. This used when the [TypedefType] was used in a legacy library.
+List<DartType>? unaliasTypes(List<DartType>? types,
+    {required bool legacyEraseAliases}) {
+  if (types == null) return null;
+  return rawUnaliasTypes(types, legacyEraseAliases: legacyEraseAliases) ??
+      types;
+}
+
+/// Replaces all occurrences of [TypedefType] in [type] with the corresponding
+/// unaliased type, or returns `null` if no [TypedefType]s were found.
+///
+/// If [legacyEraseAliases] is `true`, the unaliased types will be legacy
+/// erased. This used when the [TypedefType] was used in a legacy library.
+DartType? rawUnalias(DartType type, {required bool legacyEraseAliases}) {
+  return type.accept1(
+      legacyEraseAliases
+          ? const _Unalias(legacyEraseAliases: true)
+          : const _Unalias(legacyEraseAliases: false),
+      Variance.covariant);
+}
+
+/// Replaces all occurrences of [TypedefType] in [types] with the corresponding
+/// unaliased types, or returns `null` if no [TypedefType]s were found.
+///
+/// If [legacyEraseAliases] is `true`, the unaliased types will be legacy
+/// erased. This used when the [TypedefType] was used in a legacy library.
+List<DartType>? rawUnaliasTypes(List<DartType> types,
+    {required bool legacyEraseAliases}) {
+  List<DartType>? newTypes;
+  for (int i = 0; i < types.length; i++) {
+    DartType typeArgument = types[i];
+    DartType? newTypeArgument =
+        rawUnalias(typeArgument, legacyEraseAliases: legacyEraseAliases);
+    if (newTypeArgument != null) {
+      newTypes ??= types.toList(growable: false);
+      newTypes[i] = newTypeArgument;
+    }
+  }
+  return newTypes;
+}
+
+/// Visitor that replaces all occurrences of [TypedefType] with the
+/// corresponding unaliased type, or returns `null` if no type was replaced.
+///
+/// If [legacyEraseAliases] is `true`, the unaliased types will be legacy
+/// erased. This used when the [TypedefType] was used in a legacy library.
+class _Unalias extends ReplacementVisitor {
+  final bool legacyEraseAliases;
+
+  const _Unalias({required this.legacyEraseAliases});
+
+  @override
+  DartType visitTypedefType(TypedefType node, int variance) {
+    DartType result;
+    if (node.typeArguments.isNotEmpty) {
+      List<DartType>? newTypeArguments = null;
+      for (int i = 0; i < node.typeArguments.length; i++) {
+        DartType? substitution = node.typeArguments[i].accept1(this, variance);
+        if (substitution != null) {
+          newTypeArguments ??= node.typeArguments.toList(growable: false);
+          newTypeArguments[i] = substitution;
+        }
+      }
+      if (newTypeArguments != null) {
+        result = new TypedefType(
+                node.typedefNode, node.nullability, newTypeArguments)
+            .unalias;
+      } else {
+        result = node.unalias;
+      }
+    } else {
+      result = node.unalias;
+    }
+    if (node.nullability == Nullability.legacy ||
+        node.typedefNode.type!.nullability == Nullability.legacy) {
+      // The typedef is defined or used in an opt-out library so the nullability
+      // is based on the use site alone.
+      result = result.withDeclaredNullability(node.nullability);
+    } else {
+      result = result.withDeclaredNullability(
+          uniteNullabilities(node.nullability, result.nullability));
+    }
+    if (legacyEraseAliases) {
+      result = legacyErasure(result);
+    }
+    return result;
+  }
+}
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 1f9fab5..c550c02 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -414,14 +414,7 @@
             f.positionalParameters, f.returnType, Nullability.nonNullable,
             namedParameters: f.namedParameters,
             typeParameters: f.typeParameters,
-            requiredParameterCount: f.requiredParameterCount,
-            typedefType: new TypedefType(
-                def,
-                Nullability.nonNullable,
-                def.typeParameters
-                    .map((p) => new TypeParameterType(
-                        p, TypeParameterType.computeNullabilityFromBound(p)))
-                    .toList()));
+            requiredParameterCount: f.requiredParameterCount);
       }
     }
     return def..type = type;
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index f776684..a0ee467 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -168,10 +168,7 @@
         substitute(type.returnType), type.nullability,
         namedParameters: type.namedParameters.map(substituteNamed).toList(),
         typeParameters: freshTypeParameters,
-        requiredParameterCount: type.requiredParameterCount,
-        typedefType: type.typedefType == null
-            ? null
-            : substitute(type.typedefType!) as TypedefType);
+        requiredParameterCount: type.requiredParameterCount);
   }
 
   DartType substitute(DartType type) => substitution.substituteType(type);
@@ -769,15 +766,11 @@
         : node.namedParameters.map(inner.visitNamedType).toList();
     inner.invertVariance();
     DartType returnType = inner.visit(node.returnType);
-    TypedefType? typedefType = node.typedefType == null
-        ? null
-        : inner.visit(node.typedefType!) as TypedefType;
     if (this.useCounter == before) return node;
     return new FunctionType(positionalParameters, returnType, node.nullability,
         namedParameters: namedParameters,
         typeParameters: typeParameters,
-        requiredParameterCount: node.requiredParameterCount,
-        typedefType: typedefType);
+        requiredParameterCount: node.requiredParameterCount);
   }
 
   void bumpCountersUntil(_TypeSubstitutor target) {
@@ -941,7 +934,7 @@
 
   @override
   bool defaultDartType(DartType node) {
-    throw new UnsupportedError("Unsupported type $node (${node.runtimeType}.");
+    throw new UnsupportedError("Unsupported type $node (${node.runtimeType}).");
   }
 
   bool visitNamedType(NamedType node) {
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index e19ef36..293015d 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -566,8 +566,7 @@
         result.declaredNullability,
         namedParameters: result.namedParameters,
         typeParameters: freshTypeParameters.freshTypeParameters,
-        requiredParameterCount: result.requiredParameterCount,
-        typedefType: null);
+        requiredParameterCount: result.requiredParameterCount);
   }
 
   @override
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index cbd116e..d88c2a9 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -726,6 +726,8 @@
 }
 
 abstract class DartTypeVisitor1<R, T> {
+  const DartTypeVisitor1();
+
   R defaultDartType(DartType node, T arg);
 
   R visitInvalidType(InvalidType node, T arg) => defaultDartType(node, arg);
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 209910e..ecf11c7 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -989,10 +989,6 @@
   @override
   visitFunctionType(FunctionType node) {
     node.visitChildren(this);
-    final typedef = node.typedef;
-    if (typedef != null) {
-      shaker.addUsedTypedef(typedef);
-    }
   }
 
   @override
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
index a86774c..220d635 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -2,7 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef SomeType<contravariant T extends core::Object? = dynamic> = (core::List<T%>) → void;
 abstract class A extends core::Object {
   static method staticMethod() → void {}
 }
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 21884e4..3a888c4 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -310,11 +310,6 @@
     }
   }
 
-  if (!simple) {
-    // TODO(bkonyi): include in hash.
-    SkipOptionalDartType();  // read typedef type.
-  }
-
   CalculateDartTypeFingerprint();  // read return type.
 }
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 66a054c..e300802 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2262,10 +2262,6 @@
     }
   }
 
-  if (!simple) {
-    SkipOptionalDartType();  // read typedef type.
-  }
-
   SkipDartType();  // read return type.
 }
 
@@ -3262,10 +3258,6 @@
   }
   signature.FinalizeNameArray();
 
-  if (!simple) {
-    helper_->SkipOptionalDartType();  // read typedef type.
-  }
-
   BuildTypeInternal();  // read return type.
   signature.set_result_type(result_);
 
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 6363a5e..89d7660 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -1467,10 +1467,6 @@
     }
   }
 
-  if (!simple) {
-    helper_.SkipOptionalDartType();  // read typedef reference.
-  }
-
   VisitDartType();  // read return type.
 }
 
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 08d9da7..6e6972f 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 79;
-static const uint32_t kMaxSupportedKernelFormatVersion = 79;
+static const uint32_t kMinSupportedKernelFormatVersion = 80;
+static const uint32_t kMaxSupportedKernelFormatVersion = 80;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/tests/language/generic/f_bounded_quantification_test.dart b/tests/language/generic/f_bounded_quantification_test.dart
index 4247e7d..6b7c5fd 100644
--- a/tests/language/generic/f_bounded_quantification_test.dart
+++ b/tests/language/generic/f_bounded_quantification_test.dart
@@ -17,10 +17,10 @@
 main() {
   FBound<Bar> fb = new FBound<Bar>();
   FBound<SubBar> fsb = new FBound<SubBar>();
+//^
+// [cfe] Type argument 'SubBar' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //     ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //             ^
-  // [cfe] Type argument 'SubBar' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                       ^
   // [cfe] Type argument 'SubBar' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                              ^^^^^^
@@ -28,10 +28,10 @@
 
   FBound<Baz<Bar>> fbb = new FBound<Baz<Bar>>();
   FBound<SubBaz<Bar>> fsbb = new FBound<SubBaz<Bar>>();
+//^
+// [cfe] Type argument 'SubBaz<Bar>' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //     ^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                  ^
-  // [cfe] Type argument 'SubBaz<Bar>' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                             ^
   // [cfe] Type argument 'SubBaz<Bar>' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                                    ^^^^^^^^^^^
diff --git a/tests/language/generic/function_type_as_type_argument_test.dart b/tests/language/generic/function_type_as_type_argument_test.dart
index e932d53..0c4ae28 100644
--- a/tests/language/generic/function_type_as_type_argument_test.dart
+++ b/tests/language/generic/function_type_as_type_argument_test.dart
@@ -18,17 +18,16 @@
 
   // Generic function types are not allowed as type arguments.
   List<T Function<T>(T)> typedList = <T Function<T>(T)>[foo];
-  //   ^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT
-  //                     ^
-  // [cfe] A generic function type can't be used as a type argument.
+//^
+// [cfe] A generic function type can't be used as a type argument.
+//     ^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT
 
   // Type inference must also give an error.
   var inferredList = [foo];
-  //  ^
-  // [cfe] Generic function type 'T Function<T>(T)' inferred as a type argument.
   //                 ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
+  // [cfe] Generic function type 'T Function<T>(T)' inferred as a type argument.
 
   // No error if illegal type cannot be inferred.
   var dynamicList = <dynamic>[foo];
diff --git a/tests/language/generic/super_bounded_types_error2_test.dart b/tests/language/generic/super_bounded_types_error2_test.dart
index 39d9d4c..eed2bff 100644
--- a/tests/language/generic/super_bounded_types_error2_test.dart
+++ b/tests/language/generic/super_bounded_types_error2_test.dart
@@ -50,2286 +50,2196 @@
   FcovCyclicCoBound<Function(Never?)> x1;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Null)> x2;
 //^
 // [analyzer] unspecified
-//                                  ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(N)> x3;
 //^
 // [analyzer] unspecified
-//                               ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   CFcon<Fcon<Never?>> x4;
 //^
 // [analyzer] unspecified
-//                    ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFcon<Fcon<Null>> x5;
 //^
 // [analyzer] unspecified
-//                  ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFcon<Fcon<N>> x6;
 //^
 // [analyzer] unspecified
-//               ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CcovCyclicCoBound<Function(Never?)> x7;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(Null)> x8;
 //^
 // [analyzer] unspecified
-//                                  ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(N)> x9;
 //^
 // [analyzer] unspecified
-//                               ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
 
   // --- Same non-super-bounded types in a context.
   A<FcovCyclicCoBound<Function(Never?)>> x10;
 //^
 // [analyzer] unspecified
-//                                       ^
+//  ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<FcovCyclicCoBound<Function(Null)>> x11;
 //^
 // [analyzer] unspecified
-//                                     ^
+//  ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<FcovCyclicCoBound<Function(N)>> x12;
 //^
 // [analyzer] unspecified
-//                                  ^
+//  ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<CFcon<Fcon<Never?>>> x13;
 //^
 // [analyzer] unspecified
-//                       ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//  ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   A<CFcon<Fcon<Null>>> x14;
 //^
 // [analyzer] unspecified
-//                     ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//  ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   A<CFcon<Fcon<N>>> x15;
 //^
 // [analyzer] unspecified
-//                  ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//  ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   A<CcovCyclicCoBound<Function(Never?)>> x16;
 //^
 // [analyzer] unspecified
-//                                       ^
+//  ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   A<CcovCyclicCoBound<Function(Null)>> x17;
 //^
 // [analyzer] unspecified
-//                                     ^
+//  ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   A<CcovCyclicCoBound<Function(N)>> x18;
 //^
 // [analyzer] unspecified
-//                                  ^
+//  ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Never?)> Function() x19;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Null)> Function() x20;
 //^
 // [analyzer] unspecified
-//                                             ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(N)> Function() x21;
 //^
 // [analyzer] unspecified
-//                                          ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   CFcon<Fcon<Never?>> Function() x22;
 //^
 // [analyzer] unspecified
-//                               ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFcon<Fcon<Null>> Function() x23;
 //^
 // [analyzer] unspecified
-//                             ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFcon<Fcon<N>> Function() x24;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CcovCyclicCoBound<Function(Never?)> Function() x25;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(Null)> Function() x26;
 //^
 // [analyzer] unspecified
-//                                             ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(N)> Function() x27;
 //^
 // [analyzer] unspecified
-//                                          ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(void Function(FcovCyclicCoBound<Function(Never?)>)) x28;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(void Function(FcovCyclicCoBound<Function(Null)>)) x29;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(void Function(FcovCyclicCoBound<Function(N)>)) x30;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(void Function(CFcon<Fcon<Never?>>)) x31;
 //^
 // [analyzer] unspecified
-//                                                  ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                            ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(void Function(CFcon<Fcon<Null>>)) x32;
 //^
 // [analyzer] unspecified
-//                                                ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                            ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(void Function(CFcon<Fcon<N>>)) x33;
 //^
 // [analyzer] unspecified
-//                                             ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                            ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(void Function(CcovCyclicCoBound<Function(Never?)>)) x34;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(void Function(CcovCyclicCoBound<Function(Null)>)) x35;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(void Function(CcovCyclicCoBound<Function(N)>)) x36;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Never?)>) x37;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Null)>) x38;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(N)>) x39;
 //^
 // [analyzer] unspecified
-//                                              ^
+//              ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(CFcon<Fcon<Never?>>) x40;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//              ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFcon<Fcon<Null>>) x41;
 //^
 // [analyzer] unspecified
-//                                 ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//              ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFcon<Fcon<N>>) x42;
 //^
 // [analyzer] unspecified
-//                              ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//              ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CcovCyclicCoBound<Function(Never?)>) x43;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(Null)>) x44;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(N)>) x45;
 //^
 // [analyzer] unspecified
-//                                              ^
+//              ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Never?)>) Function() x46;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Null)>) Function() x47;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(N)>) Function() x48;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(CFcon<Fcon<Never?>>) Function() x49;
 //^
 // [analyzer] unspecified
-//                                              ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//              ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFcon<Fcon<Null>>) Function() x50;
 //^
 // [analyzer] unspecified
-//                                            ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//              ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFcon<Fcon<N>>) Function() x51;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//              ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CcovCyclicCoBound<Function(Never?)>) Function() x52;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(Null)>) Function() x53;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//              ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(N)>) Function() x54;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends FcovCyclicCoBound<Function(Never?)>>() x55;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends FcovCyclicCoBound<Function(Null)>>() x56;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends FcovCyclicCoBound<Function(N)>>() x57;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends CFcon<Fcon<Never?>>>() x58;
 //^
 // [analyzer] unspecified
-//                                               ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                        ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends CFcon<Fcon<Null>>>() x59;
 //^
 // [analyzer] unspecified
-//                                             ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                        ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends CFcon<Fcon<N>>>() x60;
 //^
 // [analyzer] unspecified
-//                                          ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                        ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends CcovCyclicCoBound<Function(Never?)>>() x61;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends CcovCyclicCoBound<Function(Null)>>() x62;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends CcovCyclicCoBound<Function(N)>>() x63;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends A<FcovCyclicCoBound<Function(Never?)>>>() x64;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends A<FcovCyclicCoBound<Function(Null)>>>() x65;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends A<FcovCyclicCoBound<Function(N)>>>() x66;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends A<CFcon<Fcon<Never?>>>>() x67;
 //^
 // [analyzer] unspecified
-//                                                  ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                          ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends A<CFcon<Fcon<Null>>>>() x68;
 //^
 // [analyzer] unspecified
-//                                                ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                          ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends A<CFcon<Fcon<N>>>>() x69;
 //^
 // [analyzer] unspecified
-//                                             ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//                          ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends A<CcovCyclicCoBound<Function(Never?)>>>() x70;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends A<CcovCyclicCoBound<Function(Null)>>>() x71;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends A<CcovCyclicCoBound<Function(N)>>>() x72;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<FcovCyclicCoBound<Function(Never?)>> x73;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<FcovCyclicCoBound<Function(Null)>> x74;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<FcovCyclicCoBound<Function(N)>> x75;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<CFcon<Fcon<Never?>>> x76;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//     ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Finv<CFcon<Fcon<Null>>> x77;
 //^
 // [analyzer] unspecified
-//                        ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//     ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Finv<CFcon<Fcon<N>>> x78;
 //^
 // [analyzer] unspecified
-//                     ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//     ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Finv<CcovCyclicCoBound<Function(Never?)>> x79;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<CcovCyclicCoBound<Function(Null)>> x80;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<CcovCyclicCoBound<Function(N)>> x81;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<FcovCyclicCoBound<Function(Never?)>> x82;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<FcovCyclicCoBound<Function(Null)>> x83;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<FcovCyclicCoBound<Function(N)>> x84;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<CFcon<Fcon<Never?>>> x85;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//     ^
+// [cfe] Type argument 'Fcon<Never?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Funu<CFcon<Fcon<Null>>> x86;
 //^
 // [analyzer] unspecified
-//                        ^
-// [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//     ^
+// [cfe] Type argument 'Fcon<Null>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Funu<CFcon<Fcon<N>>> x87;
 //^
 // [analyzer] unspecified
-//                     ^
-// [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
+//     ^
+// [cfe] Type argument 'Fcon<N>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Funu<CcovCyclicCoBound<Function(Never?)>> x88;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Never?)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<CcovCyclicCoBound<Function(Null)>> x89;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'dynamic Function(Null)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<CcovCyclicCoBound<Function(N)>> x90;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
 
   // --- Top type in a contravariant position, not super-bounded.
   FconBound<dynamic> x91;
 //^
 // [analyzer] unspecified
-//                   ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<void> x92;
 //^
 // [analyzer] unspecified
-//                ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<Object?> x93;
 //^
 // [analyzer] unspecified
-//                   ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<FutureOr<dynamic>> x94;
 //^
 // [analyzer] unspecified
-//                             ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<FutureOr<void>> x95;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<FutureOr<Object?>> x96;
 //^
 // [analyzer] unspecified
-//                             ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconCyclicBound<dynamic> x97;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<void> x98;
 //^
 // [analyzer] unspecified
-//                      ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<Object?> x99;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<FutureOr<dynamic>> x100;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<FutureOr<void>> x101;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<FutureOr<Object?>> x102;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<dynamic>> x103;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<void>> x104;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<Object?>> x105;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<FutureOr<dynamic>>> x106;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<FutureOr<void>>> x107;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<FutureOr<Object?>>> x108;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<dynamic>>> x109;
 //^
 // [analyzer] unspecified
-//                               ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<void>>> x110;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<Object?>>> x111;
 //^
 // [analyzer] unspecified
-//                               ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<FutureOr<dynamic>>>> x112;
 //^
 // [analyzer] unspecified
-//                                         ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<FutureOr<void>>>> x113;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<FutureOr<Object?>>>> x114;
 //^
 // [analyzer] unspecified
-//                                         ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicCoBound<dynamic> x115;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<void> x116;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Object?> x117;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<FutureOr<dynamic>> x118;
 //^
 // [analyzer] unspecified
-//                                     ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<FutureOr<void>> x119;
 //^
 // [analyzer] unspecified
-//                                  ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<FutureOr<Object?>> x120;
 //^
 // [analyzer] unspecified
-//                                     ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(dynamic))> x121;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(void))> x122;
 //^
 // [analyzer] unspecified
-//                                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(Object?))> x123;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(FutureOr<dynamic>))> x124;
 //^
 // [analyzer] unspecified
-//                                                         ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(FutureOr<void>))> x125;
 //^
 // [analyzer] unspecified
-//                                                      ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(FutureOr<Object?>))> x126;
 //^
 // [analyzer] unspecified
-//                                                         ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
 
   // --- Same non-super-bounded types in a context.
   A<FconBound<dynamic>> x127;
 //^
 // [analyzer] unspecified
-//                      ^
+//  ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   A<FconBound<void>> x128;
 //^
 // [analyzer] unspecified
-//                   ^
+//  ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   A<FconBound<Object?>> x129;
 //^
 // [analyzer] unspecified
-//                      ^
+//  ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   A<FconBound<FutureOr<dynamic>>> x130;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   A<FconBound<FutureOr<void>>> x131;
 //^
 // [analyzer] unspecified
-//                             ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   A<FconBound<FutureOr<Object?>>> x132;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   A<FconCyclicBound<dynamic>> x133;
 //^
 // [analyzer] unspecified
-//                            ^
+//  ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<void>> x134;
 //^
 // [analyzer] unspecified
-//                         ^
+//  ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<Object?>> x135;
 //^
 // [analyzer] unspecified
-//                            ^
+//  ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<FutureOr<dynamic>>> x136;
 //^
 // [analyzer] unspecified
-//                                      ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<FutureOr<void>>> x137;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<FutureOr<Object?>>> x138;
 //^
 // [analyzer] unspecified
-//                                      ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<dynamic>>> x139;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<void>>> x140;
 //^
 // [analyzer] unspecified
-//                            ^
+//  ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<Object?>>> x141;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<FutureOr<dynamic>>>> x142;
 //^
 // [analyzer] unspecified
-//                                         ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<FutureOr<void>>>> x143;
 //^
 // [analyzer] unspecified
-//                                      ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<FutureOr<Object?>>>> x144;
 //^
 // [analyzer] unspecified
-//                                         ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<A<dynamic>>>> x145;
 //^
 // [analyzer] unspecified
-//                                  ^
+//  ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<A<void>>>> x146;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<A<Object?>>>> x147;
 //^
 // [analyzer] unspecified
-//                                  ^
+//  ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<A<FutureOr<dynamic>>>>> x148;
 //^
 // [analyzer] unspecified
-//                                            ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<A<FutureOr<void>>>>> x149;
 //^
 // [analyzer] unspecified
-//                                         ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicBound<A<A<FutureOr<Object?>>>>> x150;
 //^
 // [analyzer] unspecified
-//                                            ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   A<FconCyclicCoBound<dynamic>> x151;
 //^
 // [analyzer] unspecified
-//                              ^
+//  ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<void>> x152;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Object?>> x153;
 //^
 // [analyzer] unspecified
-//                              ^
+//  ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<FutureOr<dynamic>>> x154;
 //^
 // [analyzer] unspecified
-//                                        ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<FutureOr<void>>> x155;
 //^
 // [analyzer] unspecified
-//                                     ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<FutureOr<Object?>>> x156;
 //^
 // [analyzer] unspecified
-//                                        ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//  ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Function(Function(dynamic))>> x157;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Function(Function(void))>> x158;
 //^
 // [analyzer] unspecified
-//                                               ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Function(Function(Object?))>> x159;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>> x160;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Function(Function(FutureOr<void>))>> x161;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   A<FconCyclicCoBound<Function(Function(FutureOr<Object?>))>> x162;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconBound<dynamic> Function() x163;
 //^
 // [analyzer] unspecified
-//                              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<void> Function() x164;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<Object?> Function() x165;
 //^
 // [analyzer] unspecified
-//                              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<FutureOr<dynamic>> Function() x166;
 //^
 // [analyzer] unspecified
-//                                        ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<FutureOr<void>> Function() x167;
 //^
 // [analyzer] unspecified
-//                                     ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconBound<FutureOr<Object?>> Function() x168;
 //^
 // [analyzer] unspecified
-//                                        ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   FconCyclicBound<dynamic> Function() x169;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<void> Function() x170;
 //^
 // [analyzer] unspecified
-//                                 ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<Object?> Function() x171;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<FutureOr<dynamic>> Function() x172;
 //^
 // [analyzer] unspecified
-//                                              ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<FutureOr<void>> Function() x173;
 //^
 // [analyzer] unspecified
-//                                           ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<FutureOr<Object?>> Function() x174;
 //^
 // [analyzer] unspecified
-//                                              ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<dynamic>> Function() x175;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<void>> Function() x176;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<Object?>> Function() x177;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<FutureOr<dynamic>>> Function() x178;
 //^
 // [analyzer] unspecified
-//                                                 ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<FutureOr<void>>> Function() x179;
 //^
 // [analyzer] unspecified
-//                                              ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<FutureOr<Object?>>> Function() x180;
 //^
 // [analyzer] unspecified
-//                                                 ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<dynamic>>> Function() x181;
 //^
 // [analyzer] unspecified
-//                                          ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<void>>> Function() x182;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<Object?>>> Function() x183;
 //^
 // [analyzer] unspecified
-//                                          ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<FutureOr<dynamic>>>> Function() x184;
 //^
 // [analyzer] unspecified
-//                                                    ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<FutureOr<void>>>> Function() x185;
 //^
 // [analyzer] unspecified
-//                                                 ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicBound<A<A<FutureOr<Object?>>>> Function() x186;
 //^
 // [analyzer] unspecified
-//                                                    ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   FconCyclicCoBound<dynamic> Function() x187;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<void> Function() x188;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Object?> Function() x189;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<FutureOr<dynamic>> Function() x190;
 //^
 // [analyzer] unspecified
-//                                                ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<FutureOr<void>> Function() x191;
 //^
 // [analyzer] unspecified
-//                                             ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<FutureOr<Object?>> Function() x192;
 //^
 // [analyzer] unspecified
-//                                                ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(dynamic))> Function() x193;
 //^
 // [analyzer] unspecified
-//                                                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(void))> Function() x194;
 //^
 // [analyzer] unspecified
-//                                                       ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(Object?))> Function() x195;
 //^
 // [analyzer] unspecified
-//                                                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(FutureOr<dynamic>))> Function() x196;
 //^
 // [analyzer] unspecified
-//                                                                    ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(FutureOr<void>))> Function() x197;
 //^
 // [analyzer] unspecified
-//                                                                 ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   FconCyclicCoBound<Function(Function(FutureOr<Object?>))> Function() x198;
 //^
 // [analyzer] unspecified
-//                                                                    ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconBound<dynamic>)) x199;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//                            ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(void Function(FconBound<void>)) x200;
 //^
 // [analyzer] unspecified
-//                                              ^
+//                            ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(void Function(FconBound<Object?>)) x201;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//                            ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(void Function(FconBound<FutureOr<dynamic>>)) x202;
 //^
 // [analyzer] unspecified
-//                                                           ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(void Function(FconBound<FutureOr<void>>)) x203;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(void Function(FconBound<FutureOr<Object?>>)) x204;
 //^
 // [analyzer] unspecified
-//                                                           ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(void Function(FconCyclicBound<dynamic>)) x205;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                            ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<void>)) x206;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//                            ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<Object?>)) x207;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                            ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<FutureOr<dynamic>>)) x208;
 //^
 // [analyzer] unspecified
-//                                                                 ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<FutureOr<void>>)) x209;
 //^
 // [analyzer] unspecified
-//                                                              ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<FutureOr<Object?>>)) x210;
 //^
 // [analyzer] unspecified
-//                                                                 ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<dynamic>>)) x211;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<void>>)) x212;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                            ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<Object?>>)) x213;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<FutureOr<dynamic>>>)) x214;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<FutureOr<void>>>)) x215;
 //^
 // [analyzer] unspecified
-//                                                                 ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<FutureOr<Object?>>>)) x216;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<A<dynamic>>>)) x217;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                            ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<A<void>>>)) x218;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<A<Object?>>>)) x219;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                            ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<A<FutureOr<dynamic>>>>)) x220;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<A<FutureOr<void>>>>)) x221;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicBound<A<A<FutureOr<Object?>>>>)) x222;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(void Function(FconCyclicCoBound<dynamic>)) x223;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                            ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconCyclicCoBound<void>)) x224;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconCyclicCoBound<Object?>)) x225;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                            ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconCyclicCoBound<FutureOr<dynamic>>)) x226;
 //^
 // [analyzer] unspecified
-//                                                                   ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconCyclicCoBound<FutureOr<void>>)) x227;
 //^
 // [analyzer] unspecified
-//                                                                ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconCyclicCoBound<FutureOr<Object?>>)) x228;
 //^
 // [analyzer] unspecified
-//                                                                   ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                            ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(void Function(FconCyclicCoBound<Function(Function(dynamic))>))
 //^
 // [analyzer] unspecified
-      x229;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x229;
   void Function(void Function(FconCyclicCoBound<Function(Function(void))>))
 //^
 // [analyzer] unspecified
-      x230;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x230;
   void Function(void Function(FconCyclicCoBound<Function(Function(Object?))>))
 //^
 // [analyzer] unspecified
-      x231;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x231;
   void Function(
       void Function(
           FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>)) x232;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(
           void Function(FconCyclicCoBound<Function(Function(FutureOr<void>))>))
 //^
 // [analyzer] unspecified
-      x233;
-//    ^
+//                      ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x233;
   void Function(
       void Function(
           FconCyclicCoBound<Function(Function(FutureOr<Object?>))>)) x234;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconBound<dynamic>) x235;
 //^
 // [analyzer] unspecified
-//                                  ^
+//              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<void>) x236;
 //^
 // [analyzer] unspecified
-//                               ^
+//              ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<Object?>) x237;
 //^
 // [analyzer] unspecified
-//                                  ^
+//              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<FutureOr<dynamic>>) x238;
 //^
 // [analyzer] unspecified
-//                                            ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<FutureOr<void>>) x239;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<FutureOr<Object?>>) x240;
 //^
 // [analyzer] unspecified
-//                                            ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconCyclicBound<dynamic>) x241;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<void>) x242;
 //^
 // [analyzer] unspecified
-//                                     ^
+//              ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<Object?>) x243;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<FutureOr<dynamic>>) x244;
 //^
 // [analyzer] unspecified
-//                                                  ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<FutureOr<void>>) x245;
 //^
 // [analyzer] unspecified
-//                                               ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<FutureOr<Object?>>) x246;
 //^
 // [analyzer] unspecified
-//                                                  ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<dynamic>>) x247;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<void>>) x248;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<Object?>>) x249;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<FutureOr<dynamic>>>) x250;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<FutureOr<void>>>) x251;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<FutureOr<Object?>>>) x252;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<dynamic>>>) x253;
 //^
 // [analyzer] unspecified
-//                                              ^
+//              ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<void>>>) x254;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<Object?>>>) x255;
 //^
 // [analyzer] unspecified
-//                                              ^
+//              ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<FutureOr<dynamic>>>>) x256;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<FutureOr<void>>>>) x257;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<FutureOr<Object?>>>>) x258;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicCoBound<dynamic>) x259;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<void>) x260;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Object?>) x261;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<FutureOr<dynamic>>) x262;
 //^
 // [analyzer] unspecified
-//                                                    ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<FutureOr<void>>) x263;
 //^
 // [analyzer] unspecified
-//                                                 ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<FutureOr<Object?>>) x264;
 //^
 // [analyzer] unspecified
-//                                                    ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(dynamic))>) x265;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(void))>) x266;
 //^
 // [analyzer] unspecified
-//                                                           ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(Object?))>) x267;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>) x268;
 //^
 // [analyzer] unspecified
-//                                                                        ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(FutureOr<void>))>) x269;
 //^
 // [analyzer] unspecified
-//                                                                     ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(FutureOr<Object?>))>) x270;
 //^
 // [analyzer] unspecified
-//                                                                        ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconBound<dynamic>) Function() x271;
 //^
 // [analyzer] unspecified
-//                                             ^
+//              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<void>) Function() x272;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<Object?>) Function() x273;
 //^
 // [analyzer] unspecified
-//                                             ^
+//              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<FutureOr<dynamic>>) Function() x274;
 //^
 // [analyzer] unspecified
-//                                                       ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<FutureOr<void>>) Function() x275;
 //^
 // [analyzer] unspecified
-//                                                    ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconBound<FutureOr<Object?>>) Function() x276;
 //^
 // [analyzer] unspecified
-//                                                       ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function(FconCyclicBound<dynamic>) Function() x277;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<void>) Function() x278;
 //^
 // [analyzer] unspecified
-//                                                ^
+//              ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<Object?>) Function() x279;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<FutureOr<dynamic>>) Function() x280;
 //^
 // [analyzer] unspecified
-//                                                             ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<FutureOr<void>>) Function() x281;
 //^
 // [analyzer] unspecified
-//                                                          ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<FutureOr<Object?>>) Function() x282;
 //^
 // [analyzer] unspecified
-//                                                             ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<dynamic>>) Function() x283;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<void>>) Function() x284;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<Object?>>) Function() x285;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<FutureOr<dynamic>>>) Function() x286;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<FutureOr<void>>>) Function() x287;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<FutureOr<Object?>>>) Function() x288;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<dynamic>>>) Function() x289;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//              ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<void>>>) Function() x290;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<Object?>>>) Function() x291;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//              ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<FutureOr<dynamic>>>>) Function() x292;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<FutureOr<void>>>>) Function() x293;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicBound<A<A<FutureOr<Object?>>>>) Function() x294;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function(FconCyclicCoBound<dynamic>) Function() x295;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<void>) Function() x296;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Object?>) Function() x297;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<FutureOr<dynamic>>) Function() x298;
 //^
 // [analyzer] unspecified
-//                                                               ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<FutureOr<void>>) Function() x299;
 //^
 // [analyzer] unspecified
-//                                                            ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<FutureOr<Object?>>) Function() x300;
 //^
 // [analyzer] unspecified
-//                                                               ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//              ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(dynamic))>) Function() x301;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(void))>) Function() x302;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(Object?))>) Function() x303;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function(FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>)
 //^
 // [analyzer] unspecified
-      Function() x304;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      Function() x304;
   void Function(FconCyclicCoBound<Function(Function(FutureOr<void>))>)
 //^
 // [analyzer] unspecified
-      Function() x305;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      Function() x305;
   void Function(FconCyclicCoBound<Function(Function(FutureOr<Object?>))>)
 //^
 // [analyzer] unspecified
-      Function() x306;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      Function() x306;
   void Function<Y extends FconBound<dynamic>>() x307;
 //^
 // [analyzer] unspecified
-//                                              ^
+//                        ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends FconBound<void>>() x308;
 //^
 // [analyzer] unspecified
-//                                           ^
+//                        ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends FconBound<Object?>>() x309;
 //^
 // [analyzer] unspecified
-//                                              ^
+//                        ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends FconBound<FutureOr<dynamic>>>() x310;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends FconBound<FutureOr<void>>>() x311;
 //^
 // [analyzer] unspecified
-//                                                     ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends FconBound<FutureOr<Object?>>>() x312;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends FconCyclicBound<dynamic>>() x313;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//                        ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<void>>() x314;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//                        ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<Object?>>() x315;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//                        ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<FutureOr<dynamic>>>() x316;
 //^
 // [analyzer] unspecified
-//                                                              ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<FutureOr<void>>>() x317;
 //^
 // [analyzer] unspecified
-//                                                           ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<FutureOr<Object?>>>() x318;
 //^
 // [analyzer] unspecified
-//                                                              ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<dynamic>>>() x319;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<void>>>() x320;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//                        ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<Object?>>>() x321;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<FutureOr<dynamic>>>>() x322;
 //^
 // [analyzer] unspecified
-//                                                                 ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<FutureOr<void>>>>() x323;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<FutureOr<Object?>>>>() x324;
 //^
 // [analyzer] unspecified
-//                                                                 ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<A<dynamic>>>>() x325;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                        ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<A<void>>>>() x326;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<A<Object?>>>>() x327;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                        ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<A<FutureOr<dynamic>>>>>() x328;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<A<FutureOr<void>>>>>() x329;
 //^
 // [analyzer] unspecified
-//                                                                 ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicBound<A<A<FutureOr<Object?>>>>>() x330;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends FconCyclicCoBound<dynamic>>() x331;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                        ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<void>>() x332;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<Object?>>() x333;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                        ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<FutureOr<dynamic>>>() x334;
 //^
 // [analyzer] unspecified
-//                                                                ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<FutureOr<void>>>() x335;
 //^
 // [analyzer] unspecified
-//                                                             ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<FutureOr<Object?>>>() x336;
 //^
 // [analyzer] unspecified
-//                                                                ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                        ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<Function(Function(dynamic))>>()
 //^
 // [analyzer] unspecified
-      x337;
-//    ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x337;
   void Function<Y extends FconCyclicCoBound<Function(Function(void))>>() x338;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends FconCyclicCoBound<Function(Function(Object?))>>()
 //^
 // [analyzer] unspecified
-      x339;
-//    ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x339;
   void Function<
           Y extends FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>>()
 //^
 // [analyzer] unspecified
-      x340;
-//    ^
+//                  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x340;
   void Function<
       Y extends FconCyclicCoBound<Function(Function(FutureOr<void>))>>() x341;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<
           Y extends FconCyclicCoBound<Function(Function(FutureOr<Object?>))>>()
 //^
 // [analyzer] unspecified
-      x342;
-//    ^
+//                  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x342;
   void Function<Y extends A<FconBound<dynamic>>>() x343;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//                          ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends A<FconBound<void>>>() x344;
 //^
 // [analyzer] unspecified
-//                                              ^
+//                          ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends A<FconBound<Object?>>>() x345;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//                          ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends A<FconBound<FutureOr<dynamic>>>>() x346;
 //^
 // [analyzer] unspecified
-//                                                           ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends A<FconBound<FutureOr<void>>>>() x347;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends A<FconBound<FutureOr<Object?>>>>() x348;
 //^
 // [analyzer] unspecified
-//                                                           ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   void Function<Y extends A<FconCyclicBound<dynamic>>>() x349;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                          ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<void>>>() x350;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//                          ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<Object?>>>() x351;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                          ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<FutureOr<dynamic>>>>() x352;
 //^
 // [analyzer] unspecified
-//                                                                 ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<FutureOr<void>>>>() x353;
 //^
 // [analyzer] unspecified
-//                                                              ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<FutureOr<Object?>>>>() x354;
 //^
 // [analyzer] unspecified
-//                                                                 ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<dynamic>>>>() x355;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<void>>>>() x356;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                          ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<Object?>>>>() x357;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<FutureOr<dynamic>>>>>() x358;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<FutureOr<void>>>>>() x359;
 //^
 // [analyzer] unspecified
-//                                                                 ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<FutureOr<Object?>>>>>() x360;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<A<dynamic>>>>>() x361;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                          ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<A<void>>>>>() x362;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<A<Object?>>>>>() x363;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                          ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<A<FutureOr<dynamic>>>>>>() x364;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<A<FutureOr<void>>>>>>() x365;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicBound<A<A<FutureOr<Object?>>>>>>() x366;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   void Function<Y extends A<FconCyclicCoBound<dynamic>>>() x367;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                          ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends A<FconCyclicCoBound<void>>>() x368;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends A<FconCyclicCoBound<Object?>>>() x369;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                          ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends A<FconCyclicCoBound<FutureOr<dynamic>>>>() x370;
 //^
 // [analyzer] unspecified
-//                                                                   ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends A<FconCyclicCoBound<FutureOr<void>>>>() x371;
 //^
 // [analyzer] unspecified
-//                                                                ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends A<FconCyclicCoBound<FutureOr<Object?>>>>() x372;
 //^
 // [analyzer] unspecified
-//                                                                   ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//                          ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<Y extends A<FconCyclicCoBound<Function(Function(dynamic))>>>()
 //^
 // [analyzer] unspecified
-      x373;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x373;
   void Function<Y extends A<FconCyclicCoBound<Function(Function(void))>>>()
 //^
 // [analyzer] unspecified
-      x374;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x374;
   void Function<Y extends A<FconCyclicCoBound<Function(Function(Object?))>>>()
 //^
 // [analyzer] unspecified
-      x375;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x375;
   void Function<
       Y extends A<
           FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>>>() x376;
 //^
 // [analyzer] unspecified
-//                                                                     ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   void Function<
           Y extends A<FconCyclicCoBound<Function(Function(FutureOr<void>))>>>()
 //^
 // [analyzer] unspecified
-      x377;
-//    ^
+//                    ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+      x377;
   void Function<
       Y extends A<
           FconCyclicCoBound<Function(Function(FutureOr<Object?>))>>>() x378;
 //^
 // [analyzer] unspecified
-//                                                                     ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconBound<dynamic>> x379;
 //^
 // [analyzer] unspecified
-//                         ^
+//     ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Finv<FconBound<void>> x380;
 //^
 // [analyzer] unspecified
-//                      ^
+//     ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Finv<FconBound<Object?>> x381;
 //^
 // [analyzer] unspecified
-//                         ^
+//     ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Finv<FconBound<FutureOr<dynamic>>> x382;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Finv<FconBound<FutureOr<void>>> x383;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Finv<FconBound<FutureOr<Object?>>> x384;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Finv<FconCyclicBound<dynamic>> x385;
 //^
 // [analyzer] unspecified
-//                               ^
+//     ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<void>> x386;
 //^
 // [analyzer] unspecified
-//                            ^
+//     ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<Object?>> x387;
 //^
 // [analyzer] unspecified
-//                               ^
+//     ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<FutureOr<dynamic>>> x388;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<FutureOr<void>>> x389;
 //^
 // [analyzer] unspecified
-//                                      ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<FutureOr<Object?>>> x390;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<dynamic>>> x391;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<void>>> x392;
 //^
 // [analyzer] unspecified
-//                               ^
+//     ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<Object?>>> x393;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<FutureOr<dynamic>>>> x394;
 //^
 // [analyzer] unspecified
-//                                            ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<FutureOr<void>>>> x395;
 //^
 // [analyzer] unspecified
-//                                         ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<FutureOr<Object?>>>> x396;
 //^
 // [analyzer] unspecified
-//                                            ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<A<dynamic>>>> x397;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<A<void>>>> x398;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<A<Object?>>>> x399;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<A<FutureOr<dynamic>>>>> x400;
 //^
 // [analyzer] unspecified
-//                                               ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<A<FutureOr<void>>>>> x401;
 //^
 // [analyzer] unspecified
-//                                            ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicBound<A<A<FutureOr<Object?>>>>> x402;
 //^
 // [analyzer] unspecified
-//                                               ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Finv<FconCyclicCoBound<dynamic>> x403;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<void>> x404;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Object?>> x405;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<FutureOr<dynamic>>> x406;
 //^
 // [analyzer] unspecified
-//                                           ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<FutureOr<void>>> x407;
 //^
 // [analyzer] unspecified
-//                                        ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<FutureOr<Object?>>> x408;
 //^
 // [analyzer] unspecified
-//                                           ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Function(Function(dynamic))>> x409;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Function(Function(void))>> x410;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Function(Function(Object?))>> x411;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>> x412;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Function(Function(FutureOr<void>))>> x413;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Finv<FconCyclicCoBound<Function(Function(FutureOr<Object?>))>> x414;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconBound<dynamic>> x415;
 //^
 // [analyzer] unspecified
-//                         ^
+//     ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Funu<FconBound<void>> x416;
 //^
 // [analyzer] unspecified
-//                      ^
+//     ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Funu<FconBound<Object?>> x417;
 //^
 // [analyzer] unspecified
-//                         ^
+//     ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Funu<FconBound<FutureOr<dynamic>>> x418;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Funu<FconBound<FutureOr<void>>> x419;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Funu<FconBound<FutureOr<Object?>>> x420;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'num' of the type variable 'X' on 'FconBound'.
   Funu<FconCyclicBound<dynamic>> x421;
 //^
 // [analyzer] unspecified
-//                               ^
+//     ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<void>> x422;
 //^
 // [analyzer] unspecified
-//                            ^
+//     ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<Object?>> x423;
 //^
 // [analyzer] unspecified
-//                               ^
+//     ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<FutureOr<dynamic>>> x424;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<FutureOr<void>>> x425;
 //^
 // [analyzer] unspecified
-//                                      ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<FutureOr<Object?>>> x426;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<dynamic>>> x427;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<void>>> x428;
 //^
 // [analyzer] unspecified
-//                               ^
+//     ^
 // [cfe] Type argument 'A<void>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<Object?>>> x429;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<FutureOr<dynamic>>>> x430;
 //^
 // [analyzer] unspecified
-//                                            ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<FutureOr<void>>>> x431;
 //^
 // [analyzer] unspecified
-//                                         ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<FutureOr<Object?>>>> x432;
 //^
 // [analyzer] unspecified
-//                                            ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<A<dynamic>>>> x433;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'A<A<dynamic>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<A<void>>>> x434;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'A<A<void>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<A<Object?>>>> x435;
 //^
 // [analyzer] unspecified
-//                                     ^
+//     ^
 // [cfe] Type argument 'A<A<Object?>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<A<FutureOr<dynamic>>>>> x436;
 //^
 // [analyzer] unspecified
-//                                               ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<dynamic>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<A<FutureOr<void>>>>> x437;
 //^
 // [analyzer] unspecified
-//                                            ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<void>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicBound<A<A<FutureOr<Object?>>>>> x438;
 //^
 // [analyzer] unspecified
-//                                               ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object?>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FconCyclicBound'.
   Funu<FconCyclicCoBound<dynamic>> x439;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'dynamic' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<void>> x440;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'void' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Object?>> x441;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'Object?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<FutureOr<dynamic>>> x442;
 //^
 // [analyzer] unspecified
-//                                           ^
-// [cfe] Type argument 'FutureOr<dynamic>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<dynamic>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<FutureOr<void>>> x443;
 //^
 // [analyzer] unspecified
-//                                        ^
-// [cfe] Type argument 'FutureOr<void>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<void>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<FutureOr<Object?>>> x444;
 //^
 // [analyzer] unspecified
-//                                           ^
-// [cfe] Type argument 'FutureOr<Object?>?' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
+//     ^
+// [cfe] Type argument 'FutureOr<Object?>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Function(Function(dynamic))>> x445;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(dynamic))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Function(Function(void))>> x446;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(void))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Function(Function(Object?))>> x447;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object?))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Function(Function(FutureOr<dynamic>))>> x448;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<dynamic>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Function(Function(FutureOr<void>))>> x449;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<void>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
   Funu<FconCyclicCoBound<Function(Function(FutureOr<Object?>))>> x450;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object?>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FconCyclicCoBound'.
 }
 
diff --git a/tests/language/generic/super_bounded_types_error_test.dart b/tests/language/generic/super_bounded_types_error_test.dart
index 5f523bc..7917fa7 100644
--- a/tests/language/generic/super_bounded_types_error_test.dart
+++ b/tests/language/generic/super_bounded_types_error_test.dart
@@ -62,1820 +62,1748 @@
   FcovBound<Object> x1;
 //^
 // [analyzer] unspecified
-//                  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   FcovBound<FutureOr<Object>> x2;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   FcovCyclicBound<Object> x3;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<FutureOr<Object>> x4;
 //^
 // [analyzer] unspecified
-//                                  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<Object>> x5;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<FutureOr<Object>>> x6;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<A<Object>>> x7;
 //^
 // [analyzer] unspecified
-//                              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<A<FutureOr<Object>>>> x8;
 //^
 // [analyzer] unspecified
-//                                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicCoBound<Object> x9;
 //^
 // [analyzer] unspecified
-//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<FutureOr<Object>> x10;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Function(Object))> x11;
 //^
 // [analyzer] unspecified
-//                                              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Function(FutureOr<Object>))> x12;
 //^
 // [analyzer] unspecified
-//                                                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   CFcov<Object> x13;
 //^
 // [analyzer] unspecified
-//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<FutureOr<Object>> x14;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<Object>> x15;
 //^
 // [analyzer] unspecified
-//                    ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<FutureOr<Object>>> x16;
 //^
 // [analyzer] unspecified
-//                              ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<Fcov<Object>>> x17;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<Fcov<FutureOr<Object>>>> x18;
 //^
 // [analyzer] unspecified
-//                                    ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcon<Object> x19;
 //^
 // [analyzer] unspecified
-//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFcon<FutureOr<Object>> x20;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFinv<Object> x21;
 //^
 // [analyzer] unspecified
-//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   CFinv<FutureOr<Object>> x22;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   CFunu<Object> x23;
 //^
 // [analyzer] unspecified
-//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   CFunu<FutureOr<Object>> x24;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   CcovBound<Object> x25;
 //^
 // [analyzer] unspecified
-//                  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   CcovBound<FutureOr<Object>> x26;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   CcovCyclicBound<Object> x27;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<FutureOr<Object>> x28;
 //^
 // [analyzer] unspecified
-//                                  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<Object>> x29;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<FutureOr<Object>>> x30;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<A<Object>>> x31;
 //^
 // [analyzer] unspecified
-//                              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<A<FutureOr<Object>>>> x32;
 //^
 // [analyzer] unspecified
-//                                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicCoBound<Object> x33;
 //^
 // [analyzer] unspecified
-//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<FutureOr<Object>> x34;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(Function(Object))> x35;
 //^
 // [analyzer] unspecified
-//                                              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(Function(FutureOr<Object>))> x36;
 //^
 // [analyzer] unspecified
-//                                                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
 
   // --- Same non-super-bounded types in a context.
   A<FcovBound<Object>> x37;
 //^
 // [analyzer] unspecified
-//                     ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   A<FcovBound<FutureOr<Object>>> x38;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   A<FcovCyclicBound<Object>> x39;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   A<FcovCyclicBound<FutureOr<Object>>> x40;
 //^
 // [analyzer] unspecified
-//                                     ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   A<FcovCyclicBound<A<Object>>> x41;
 //^
 // [analyzer] unspecified
-//                              ^
+//  ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   A<FcovCyclicBound<A<FutureOr<Object>>>> x42;
 //^
 // [analyzer] unspecified
-//                                        ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   A<FcovCyclicBound<A<A<Object>>>> x43;
 //^
 // [analyzer] unspecified
-//                                 ^
+//  ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   A<FcovCyclicBound<A<A<FutureOr<Object>>>>> x44;
 //^
 // [analyzer] unspecified
-//                                           ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   A<FcovCyclicCoBound<Object>> x45;
 //^
 // [analyzer] unspecified
-//                             ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<FcovCyclicCoBound<FutureOr<Object>>> x46;
 //^
 // [analyzer] unspecified
-//                                       ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<FcovCyclicCoBound<Function(Function(Object))>> x47;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<FcovCyclicCoBound<Function(Function(FutureOr<Object>))>> x48;
 //^
 // [analyzer] unspecified
-//                                                           ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   A<CFcov<Object>> x49;
 //^
 // [analyzer] unspecified
-//                 ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   A<CFcov<FutureOr<Object>>> x50;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   A<CFcov<Fcov<Object>>> x51;
 //^
 // [analyzer] unspecified
-//                       ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//  ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   A<CFcov<Fcov<FutureOr<Object>>>> x52;
 //^
 // [analyzer] unspecified
-//                                 ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//  ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   A<CFcov<Fcov<Fcov<Object>>>> x53;
 //^
 // [analyzer] unspecified
-//                             ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//  ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   A<CFcov<Fcov<Fcov<FutureOr<Object>>>>> x54;
 //^
 // [analyzer] unspecified
-//                                       ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//  ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   A<CFcon<Object>> x55;
 //^
 // [analyzer] unspecified
-//                 ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   A<CFcon<FutureOr<Object>>> x56;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   A<CFinv<Object>> x57;
 //^
 // [analyzer] unspecified
-//                 ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   A<CFinv<FutureOr<Object>>> x58;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   A<CFunu<Object>> x59;
 //^
 // [analyzer] unspecified
-//                 ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   A<CFunu<FutureOr<Object>>> x60;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   A<CcovBound<Object>> x61;
 //^
 // [analyzer] unspecified
-//                     ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   A<CcovBound<FutureOr<Object>>> x62;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   A<CcovCyclicBound<Object>> x63;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   A<CcovCyclicBound<FutureOr<Object>>> x64;
 //^
 // [analyzer] unspecified
-//                                     ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   A<CcovCyclicBound<A<Object>>> x65;
 //^
 // [analyzer] unspecified
-//                              ^
+//  ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   A<CcovCyclicBound<A<FutureOr<Object>>>> x66;
 //^
 // [analyzer] unspecified
-//                                        ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   A<CcovCyclicBound<A<A<Object>>>> x67;
 //^
 // [analyzer] unspecified
-//                                 ^
+//  ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   A<CcovCyclicBound<A<A<FutureOr<Object>>>>> x68;
 //^
 // [analyzer] unspecified
-//                                           ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   A<CcovCyclicCoBound<Object>> x69;
 //^
 // [analyzer] unspecified
-//                             ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   A<CcovCyclicCoBound<FutureOr<Object>>> x70;
 //^
 // [analyzer] unspecified
-//                                       ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   A<CcovCyclicCoBound<Function(Function(Object))>> x71;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   A<CcovCyclicCoBound<Function(Function(FutureOr<Object>))>> x72;
 //^
 // [analyzer] unspecified
-//                                                           ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   FcovBound<Object> Function() x73;
 //^
 // [analyzer] unspecified
-//                             ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   FcovBound<FutureOr<Object>> Function() x74;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   FcovCyclicBound<Object> Function() x75;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<FutureOr<Object>> Function() x76;
 //^
 // [analyzer] unspecified
-//                                             ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<Object>> Function() x77;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<FutureOr<Object>>> Function() x78;
 //^
 // [analyzer] unspecified
-//                                                ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<A<Object>>> Function() x79;
 //^
 // [analyzer] unspecified
-//                                         ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicBound<A<A<FutureOr<Object>>>> Function() x80;
 //^
 // [analyzer] unspecified
-//                                                   ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   FcovCyclicCoBound<Object> Function() x81;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<FutureOr<Object>> Function() x82;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Function(Object))> Function() x83;
 //^
 // [analyzer] unspecified
-//                                                         ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   FcovCyclicCoBound<Function(Function(FutureOr<Object>))> Function() x84;
 //^
 // [analyzer] unspecified
-//                                                                   ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   CFcov<Object> Function() x85;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<FutureOr<Object>> Function() x86;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<Object>> Function() x87;
 //^
 // [analyzer] unspecified
-//                               ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<FutureOr<Object>>> Function() x88;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<Fcov<Object>>> Function() x89;
 //^
 // [analyzer] unspecified
-//                                     ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcov<Fcov<Fcov<FutureOr<Object>>>> Function() x90;
 //^
 // [analyzer] unspecified
-//                                               ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   CFcon<Object> Function() x91;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFcon<FutureOr<Object>> Function() x92;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   CFinv<Object> Function() x93;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   CFinv<FutureOr<Object>> Function() x94;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   CFunu<Object> Function() x95;
 //^
 // [analyzer] unspecified
-//                         ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   CFunu<FutureOr<Object>> Function() x96;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   CcovBound<Object> Function() x97;
 //^
 // [analyzer] unspecified
-//                             ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   CcovBound<FutureOr<Object>> Function() x98;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   CcovCyclicBound<Object> Function() x99;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<FutureOr<Object>> Function() x100;
 //^
 // [analyzer] unspecified
-//                                             ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<Object>> Function() x101;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<FutureOr<Object>>> Function() x102;
 //^
 // [analyzer] unspecified
-//                                                ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<A<Object>>> Function() x103;
 //^
 // [analyzer] unspecified
-//                                         ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicBound<A<A<FutureOr<Object>>>> Function() x104;
 //^
 // [analyzer] unspecified
-//                                                   ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   CcovCyclicCoBound<Object> Function() x105;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<FutureOr<Object>> Function() x106;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(Function(Object))> Function() x107;
 //^
 // [analyzer] unspecified
-//                                                         ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   CcovCyclicCoBound<Function(Function(FutureOr<Object>))> Function() x108;
 //^
 // [analyzer] unspecified
-//                                                                   ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(void Function(FcovBound<Object>)) x109;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function(void Function(FcovBound<FutureOr<Object>>)) x110;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function(void Function(FcovCyclicBound<Object>)) x111;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(void Function(FcovCyclicBound<FutureOr<Object>>)) x112;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(void Function(FcovCyclicBound<A<Object>>)) x113;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                            ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(void Function(FcovCyclicBound<A<FutureOr<Object>>>)) x114;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(void Function(FcovCyclicBound<A<A<Object>>>)) x115;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                            ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(void Function(FcovCyclicBound<A<A<FutureOr<Object>>>>)) x116;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(void Function(FcovCyclicCoBound<Object>)) x117;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(void Function(FcovCyclicCoBound<FutureOr<Object>>)) x118;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(void Function(FcovCyclicCoBound<Function(Function(Object))>))
 //^
 // [analyzer] unspecified
-      x119;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
+      x119;
   void Function(
       void Function(
           FcovCyclicCoBound<Function(Function(FutureOr<Object>))>)) x120;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(void Function(CFcov<Object>)) x121;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(void Function(CFcov<FutureOr<Object>>)) x122;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(void Function(CFcov<Fcov<Object>>)) x123;
 //^
 // [analyzer] unspecified
-//                                                  ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                            ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(void Function(CFcov<Fcov<FutureOr<Object>>>)) x124;
 //^
 // [analyzer] unspecified
-//                                                            ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                            ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(void Function(CFcov<Fcov<Fcov<Object>>>)) x125;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                            ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(void Function(CFcov<Fcov<Fcov<FutureOr<Object>>>>)) x126;
 //^
 // [analyzer] unspecified
-//                                                                  ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                            ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(void Function(CFcon<Object>)) x127;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(void Function(CFcon<FutureOr<Object>>)) x128;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(void Function(CFinv<Object>)) x129;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function(void Function(CFinv<FutureOr<Object>>)) x130;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function(void Function(CFunu<Object>)) x131;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function(void Function(CFunu<FutureOr<Object>>)) x132;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function(void Function(CcovBound<Object>)) x133;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function(void Function(CcovBound<FutureOr<Object>>)) x134;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function(void Function(CcovCyclicBound<Object>)) x135;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(void Function(CcovCyclicBound<FutureOr<Object>>)) x136;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(void Function(CcovCyclicBound<A<Object>>)) x137;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                            ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(void Function(CcovCyclicBound<A<FutureOr<Object>>>)) x138;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(void Function(CcovCyclicBound<A<A<Object>>>)) x139;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                            ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(void Function(CcovCyclicBound<A<A<FutureOr<Object>>>>)) x140;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(void Function(CcovCyclicCoBound<Object>)) x141;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(void Function(CcovCyclicCoBound<FutureOr<Object>>)) x142;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(void Function(CcovCyclicCoBound<Function(Function(Object))>))
 //^
 // [analyzer] unspecified
-      x143;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
+      x143;
   void Function(
       void Function(
           CcovCyclicCoBound<Function(Function(FutureOr<Object>))>)) x144;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(FcovBound<Object>) x145;
 //^
 // [analyzer] unspecified
-//                                 ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function(FcovBound<FutureOr<Object>>) x146;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function(FcovCyclicBound<Object>) x147;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<FutureOr<Object>>) x148;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<Object>>) x149;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<FutureOr<Object>>>) x150;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<A<Object>>>) x151;
 //^
 // [analyzer] unspecified
-//                                             ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<A<FutureOr<Object>>>>) x152;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicCoBound<Object>) x153;
 //^
 // [analyzer] unspecified
-//                                         ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<FutureOr<Object>>) x154;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Function(Object))>) x155;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Function(FutureOr<Object>))>) x156;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(CFcov<Object>) x157;
 //^
 // [analyzer] unspecified
-//                             ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<FutureOr<Object>>) x158;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<Object>>) x159;
 //^
 // [analyzer] unspecified
-//                                   ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<FutureOr<Object>>>) x160;
 //^
 // [analyzer] unspecified
-//                                             ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<Fcov<Object>>>) x161;
 //^
 // [analyzer] unspecified
-//                                         ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<Fcov<FutureOr<Object>>>>) x162;
 //^
 // [analyzer] unspecified
-//                                                   ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcon<Object>) x163;
 //^
 // [analyzer] unspecified
-//                             ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFcon<FutureOr<Object>>) x164;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFinv<Object>) x165;
 //^
 // [analyzer] unspecified
-//                             ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function(CFinv<FutureOr<Object>>) x166;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function(CFunu<Object>) x167;
 //^
 // [analyzer] unspecified
-//                             ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function(CFunu<FutureOr<Object>>) x168;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function(CcovBound<Object>) x169;
 //^
 // [analyzer] unspecified
-//                                 ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function(CcovBound<FutureOr<Object>>) x170;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function(CcovCyclicBound<Object>) x171;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<FutureOr<Object>>) x172;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<Object>>) x173;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<FutureOr<Object>>>) x174;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<A<Object>>>) x175;
 //^
 // [analyzer] unspecified
-//                                             ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<A<FutureOr<Object>>>>) x176;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicCoBound<Object>) x177;
 //^
 // [analyzer] unspecified
-//                                         ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<FutureOr<Object>>) x178;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(Function(Object))>) x179;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(Function(FutureOr<Object>))>) x180;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(FcovBound<Object>) Function() x181;
 //^
 // [analyzer] unspecified
-//                                            ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function(FcovBound<FutureOr<Object>>) Function() x182;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function(FcovCyclicBound<Object>) Function() x183;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<FutureOr<Object>>) Function() x184;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<Object>>) Function() x185;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<FutureOr<Object>>>) Function() x186;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<A<Object>>>) Function() x187;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicBound<A<A<FutureOr<Object>>>>) Function() x188;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function(FcovCyclicCoBound<Object>) Function() x189;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<FutureOr<Object>>) Function() x190;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Function(Object))>) Function() x191;
 //^
 // [analyzer] unspecified
-//                                                                        ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function(FcovCyclicCoBound<Function(Function(FutureOr<Object>))>)
 //^
 // [analyzer] unspecified
-      Function() x192;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
+      Function() x192;
   void Function(CFcov<Object>) Function() x193;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<FutureOr<Object>>) Function() x194;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<Object>>) Function() x195;
 //^
 // [analyzer] unspecified
-//                                              ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<FutureOr<Object>>>) Function() x196;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<Fcov<Object>>>) Function() x197;
 //^
 // [analyzer] unspecified
-//                                                    ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcov<Fcov<Fcov<FutureOr<Object>>>>) Function() x198;
 //^
 // [analyzer] unspecified
-//                                                              ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//              ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function(CFcon<Object>) Function() x199;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFcon<FutureOr<Object>>) Function() x200;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function(CFinv<Object>) Function() x201;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function(CFinv<FutureOr<Object>>) Function() x202;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function(CFunu<Object>) Function() x203;
 //^
 // [analyzer] unspecified
-//                                        ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function(CFunu<FutureOr<Object>>) Function() x204;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function(CcovBound<Object>) Function() x205;
 //^
 // [analyzer] unspecified
-//                                            ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function(CcovBound<FutureOr<Object>>) Function() x206;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function(CcovCyclicBound<Object>) Function() x207;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<FutureOr<Object>>) Function() x208;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<Object>>) Function() x209;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<FutureOr<Object>>>) Function() x210;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<A<Object>>>) Function() x211;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicBound<A<A<FutureOr<Object>>>>) Function() x212;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function(CcovCyclicCoBound<Object>) Function() x213;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<FutureOr<Object>>) Function() x214;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(Function(Object))>) Function() x215;
 //^
 // [analyzer] unspecified
-//                                                                        ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function(CcovCyclicCoBound<Function(Function(FutureOr<Object>))>)
 //^
 // [analyzer] unspecified
-      Function() x216;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
+      Function() x216;
   void Function<Y extends FcovBound<Object>>() x217;
 //^
 // [analyzer] unspecified
-//                                             ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function<Y extends FcovBound<FutureOr<Object>>>() x218;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function<Y extends FcovCyclicBound<Object>>() x219;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends FcovCyclicBound<FutureOr<Object>>>() x220;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends FcovCyclicBound<A<Object>>>() x221;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                        ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends FcovCyclicBound<A<FutureOr<Object>>>>() x222;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends FcovCyclicBound<A<A<Object>>>>() x223;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                        ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends FcovCyclicBound<A<A<FutureOr<Object>>>>>() x224;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends FcovCyclicCoBound<Object>>() x225;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends FcovCyclicCoBound<FutureOr<Object>>>() x226;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends FcovCyclicCoBound<Function(Function(Object))>>() x227;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<
       Y extends FcovCyclicCoBound<Function(Function(FutureOr<Object>))>>() x228;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends CFcov<Object>>() x229;
 //^
 // [analyzer] unspecified
-//                                         ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends CFcov<FutureOr<Object>>>() x230;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends CFcov<Fcov<Object>>>() x231;
 //^
 // [analyzer] unspecified
-//                                               ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                        ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends CFcov<Fcov<FutureOr<Object>>>>() x232;
 //^
 // [analyzer] unspecified
-//                                                         ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                        ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends CFcov<Fcov<Fcov<Object>>>>() x233;
 //^
 // [analyzer] unspecified
-//                                                     ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                        ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends CFcov<Fcov<Fcov<FutureOr<Object>>>>>() x234;
 //^
 // [analyzer] unspecified
-//                                                               ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                        ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends CFcon<Object>>() x235;
 //^
 // [analyzer] unspecified
-//                                         ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends CFcon<FutureOr<Object>>>() x236;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends CFinv<Object>>() x237;
 //^
 // [analyzer] unspecified
-//                                         ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function<Y extends CFinv<FutureOr<Object>>>() x238;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function<Y extends CFunu<Object>>() x239;
 //^
 // [analyzer] unspecified
-//                                         ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function<Y extends CFunu<FutureOr<Object>>>() x240;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function<Y extends CcovBound<Object>>() x241;
 //^
 // [analyzer] unspecified
-//                                             ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function<Y extends CcovBound<FutureOr<Object>>>() x242;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function<Y extends CcovCyclicBound<Object>>() x243;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends CcovCyclicBound<FutureOr<Object>>>() x244;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends CcovCyclicBound<A<Object>>>() x245;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                        ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends CcovCyclicBound<A<FutureOr<Object>>>>() x246;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends CcovCyclicBound<A<A<Object>>>>() x247;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                        ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends CcovCyclicBound<A<A<FutureOr<Object>>>>>() x248;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends CcovCyclicCoBound<Object>>() x249;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends CcovCyclicCoBound<FutureOr<Object>>>() x250;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends CcovCyclicCoBound<Function(Function(Object))>>() x251;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<
       Y extends CcovCyclicCoBound<Function(Function(FutureOr<Object>))>>() x252;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends A<FcovBound<Object>>>() x253;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function<Y extends A<FcovBound<FutureOr<Object>>>>() x254;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   void Function<Y extends A<FcovCyclicBound<Object>>>() x255;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends A<FcovCyclicBound<FutureOr<Object>>>>() x256;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends A<FcovCyclicBound<A<Object>>>>() x257;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                          ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends A<FcovCyclicBound<A<FutureOr<Object>>>>>() x258;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends A<FcovCyclicBound<A<A<Object>>>>>() x259;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                          ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends A<FcovCyclicBound<A<A<FutureOr<Object>>>>>>() x260;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   void Function<Y extends A<FcovCyclicCoBound<Object>>>() x261;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends A<FcovCyclicCoBound<FutureOr<Object>>>>() x262;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends A<FcovCyclicCoBound<Function(Function(Object))>>>()
 //^
 // [analyzer] unspecified
-      x263;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
+      x263;
   void Function<
       Y extends A<
           FcovCyclicCoBound<Function(Function(FutureOr<Object>))>>>() x264;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   void Function<Y extends A<CFcov<Object>>>() x265;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends A<CFcov<FutureOr<Object>>>>() x266;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends A<CFcov<Fcov<Object>>>>() x267;
 //^
 // [analyzer] unspecified
-//                                                  ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                          ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends A<CFcov<Fcov<FutureOr<Object>>>>>() x268;
 //^
 // [analyzer] unspecified
-//                                                            ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                          ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends A<CFcov<Fcov<Fcov<Object>>>>>() x269;
 //^
 // [analyzer] unspecified
-//                                                        ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                          ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends A<CFcov<Fcov<Fcov<FutureOr<Object>>>>>>() x270;
 //^
 // [analyzer] unspecified
-//                                                                  ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//                          ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   void Function<Y extends A<CFcon<Object>>>() x271;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends A<CFcon<FutureOr<Object>>>>() x272;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   void Function<Y extends A<CFinv<Object>>>() x273;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function<Y extends A<CFinv<FutureOr<Object>>>>() x274;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   void Function<Y extends A<CFunu<Object>>>() x275;
 //^
 // [analyzer] unspecified
-//                                            ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function<Y extends A<CFunu<FutureOr<Object>>>>() x276;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   void Function<Y extends A<CcovBound<Object>>>() x277;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function<Y extends A<CcovBound<FutureOr<Object>>>>() x278;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   void Function<Y extends A<CcovCyclicBound<Object>>>() x279;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends A<CcovCyclicBound<FutureOr<Object>>>>() x280;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends A<CcovCyclicBound<A<Object>>>>() x281;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                          ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends A<CcovCyclicBound<A<FutureOr<Object>>>>>() x282;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends A<CcovCyclicBound<A<A<Object>>>>>() x283;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                          ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends A<CcovCyclicBound<A<A<FutureOr<Object>>>>>>() x284;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   void Function<Y extends A<CcovCyclicCoBound<Object>>>() x285;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends A<CcovCyclicCoBound<FutureOr<Object>>>>() x286;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   void Function<Y extends A<CcovCyclicCoBound<Function(Function(Object))>>>()
 //^
 // [analyzer] unspecified
-      x287;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
+      x287;
   void Function<
       Y extends A<
           CcovCyclicCoBound<Function(Function(FutureOr<Object>))>>>() x288;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<FcovBound<Object>> x289;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   Finv<FcovBound<FutureOr<Object>>> x290;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   Finv<FcovCyclicBound<Object>> x291;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Finv<FcovCyclicBound<FutureOr<Object>>> x292;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Finv<FcovCyclicBound<A<Object>>> x293;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Finv<FcovCyclicBound<A<FutureOr<Object>>>> x294;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Finv<FcovCyclicBound<A<A<Object>>>> x295;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Finv<FcovCyclicBound<A<A<FutureOr<Object>>>>> x296;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Finv<FcovCyclicCoBound<Object>> x297;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<FcovCyclicCoBound<FutureOr<Object>>> x298;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<FcovCyclicCoBound<Function(Function(Object))>> x299;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<FcovCyclicCoBound<Function(Function(FutureOr<Object>))>> x300;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Finv<CFcov<Object>> x301;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Finv<CFcov<FutureOr<Object>>> x302;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Finv<CFcov<Fcov<Object>>> x303;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Finv<CFcov<Fcov<FutureOr<Object>>>> x304;
 //^
 // [analyzer] unspecified
-//                                    ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Finv<CFcov<Fcov<Fcov<Object>>>> x305;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Finv<CFcov<Fcov<Fcov<FutureOr<Object>>>>> x306;
 //^
 // [analyzer] unspecified
-//                                          ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Finv<CFcon<Object>> x307;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Finv<CFcon<FutureOr<Object>>> x308;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Finv<CFinv<Object>> x309;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   Finv<CFinv<FutureOr<Object>>> x310;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   Finv<CFunu<Object>> x311;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   Finv<CFunu<FutureOr<Object>>> x312;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   Finv<CcovBound<Object>> x313;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   Finv<CcovBound<FutureOr<Object>>> x314;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   Finv<CcovCyclicBound<Object>> x315;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Finv<CcovCyclicBound<FutureOr<Object>>> x316;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Finv<CcovCyclicBound<A<Object>>> x317;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Finv<CcovCyclicBound<A<FutureOr<Object>>>> x318;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Finv<CcovCyclicBound<A<A<Object>>>> x319;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Finv<CcovCyclicBound<A<A<FutureOr<Object>>>>> x320;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Finv<CcovCyclicCoBound<Object>> x321;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<CcovCyclicCoBound<FutureOr<Object>>> x322;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<CcovCyclicCoBound<Function(Function(Object))>> x323;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Finv<CcovCyclicCoBound<Function(Function(FutureOr<Object>))>> x324;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<FcovBound<Object>> x325;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   Funu<FcovBound<FutureOr<Object>>> x326;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FcovBound'.
   Funu<FcovCyclicBound<Object>> x327;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Funu<FcovCyclicBound<FutureOr<Object>>> x328;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Funu<FcovCyclicBound<A<Object>>> x329;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Funu<FcovCyclicBound<A<FutureOr<Object>>>> x330;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Funu<FcovCyclicBound<A<A<Object>>>> x331;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Funu<FcovCyclicBound<A<A<FutureOr<Object>>>>> x332;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FcovCyclicBound'.
   Funu<FcovCyclicCoBound<Object>> x333;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<FcovCyclicCoBound<FutureOr<Object>>> x334;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<FcovCyclicCoBound<Function(Function(Object))>> x335;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<FcovCyclicCoBound<Function(Function(FutureOr<Object>))>> x336;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FcovCyclicCoBound'.
   Funu<CFcov<Object>> x337;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Funu<CFcov<FutureOr<Object>>> x338;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Funu<CFcov<Fcov<Object>>> x339;
 //^
 // [analyzer] unspecified
-//                          ^
-// [cfe] Type argument 'Object Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<Object>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Funu<CFcov<Fcov<FutureOr<Object>>>> x340;
 //^
 // [analyzer] unspecified
-//                                    ^
-// [cfe] Type argument 'FutureOr<Object> Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<FutureOr<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Funu<CFcov<Fcov<Fcov<Object>>>> x341;
 //^
 // [analyzer] unspecified
-//                                ^
-// [cfe] Type argument 'Object Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<Fcov<Object>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Funu<CFcov<Fcov<Fcov<FutureOr<Object>>>>> x342;
 //^
 // [analyzer] unspecified
-//                                          ^
-// [cfe] Type argument 'FutureOr<Object> Function() Function()' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
+//     ^
+// [cfe] Type argument 'Fcov<Fcov<FutureOr<Object>>>' doesn't conform to the bound 'X Function()' of the type variable 'X' on 'CFcov'.
   Funu<CFcon<Object>> x343;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Funu<CFcon<FutureOr<Object>>> x344;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CFcon'.
   Funu<CFinv<Object>> x345;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   Funu<CFinv<FutureOr<Object>>> x346;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'X Function(X)' of the type variable 'X' on 'CFinv'.
   Funu<CFunu<Object>> x347;
 //^
 // [analyzer] unspecified
-//                    ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   Funu<CFunu<FutureOr<Object>>> x348;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'CFunu'.
   Funu<CcovBound<Object>> x349;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   Funu<CcovBound<FutureOr<Object>>> x350;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'CcovBound'.
   Funu<CcovCyclicBound<Object>> x351;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Funu<CcovCyclicBound<FutureOr<Object>>> x352;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Funu<CcovCyclicBound<A<Object>>> x353;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Funu<CcovCyclicBound<A<FutureOr<Object>>>> x354;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Funu<CcovCyclicBound<A<A<Object>>>> x355;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Funu<CcovCyclicBound<A<A<FutureOr<Object>>>>> x356;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'CcovCyclicBound'.
   Funu<CcovCyclicCoBound<Object>> x357;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<CcovCyclicCoBound<FutureOr<Object>>> x358;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<CcovCyclicCoBound<Function(Function(Object))>> x359;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
   Funu<CcovCyclicCoBound<Function(Function(FutureOr<Object>))>> x360;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'CcovCyclicCoBound'.
 }
 
@@ -1884,612 +1812,588 @@
   FinvBound<Object> x1;
 //^
 // [analyzer] unspecified
-//                  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   FinvBound<FutureOr<Object>> x2;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   FinvCyclicBound<Object> x3;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<FutureOr<Object>> x4;
 //^
 // [analyzer] unspecified
-//                                  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<Object>> x5;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<FutureOr<Object>>> x6;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<A<Object>>> x7;
 //^
 // [analyzer] unspecified
-//                              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<A<FutureOr<Object>>>> x8;
 //^
 // [analyzer] unspecified
-//                                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicCoBound<Object> x9;
 //^
 // [analyzer] unspecified
-//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvCyclicCoBound<FutureOr<Object>> x10;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvCyclicCoBound<Function(Function(Object))> x11;
 //^
 // [analyzer] unspecified
-//                                              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvCyclicCoBound<Function(Function(FutureOr<Object>))> x12;
 //^
 // [analyzer] unspecified
-//                                                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
 
   // --- Same non-super-bounded types in a context.
   A<FinvBound<Object>> x13;
 //^
 // [analyzer] unspecified
-//                     ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   A<FinvBound<FutureOr<Object>>> x14;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   A<FinvCyclicBound<Object>> x15;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   A<FinvCyclicBound<FutureOr<Object>>> x16;
 //^
 // [analyzer] unspecified
-//                                     ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   A<FinvCyclicBound<A<Object>>> x17;
 //^
 // [analyzer] unspecified
-//                              ^
+//  ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   A<FinvCyclicBound<A<FutureOr<Object>>>> x18;
 //^
 // [analyzer] unspecified
-//                                        ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   A<FinvCyclicBound<A<A<Object>>>> x19;
 //^
 // [analyzer] unspecified
-//                                 ^
+//  ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   A<FinvCyclicBound<A<A<FutureOr<Object>>>>> x20;
 //^
 // [analyzer] unspecified
-//                                           ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   A<FinvCyclicCoBound<Object>> x21;
 //^
 // [analyzer] unspecified
-//                             ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   A<FinvCyclicCoBound<FutureOr<Object>>> x22;
 //^
 // [analyzer] unspecified
-//                                       ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   A<FinvCyclicCoBound<Function(Function(Object))>> x23;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   A<FinvCyclicCoBound<Function(Function(FutureOr<Object>))>> x24;
 //^
 // [analyzer] unspecified
-//                                                           ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvBound<Object> Function() x25;
 //^
 // [analyzer] unspecified
-//                             ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   FinvBound<FutureOr<Object>> Function() x26;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   FinvCyclicBound<Object> Function() x27;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<FutureOr<Object>> Function() x28;
 //^
 // [analyzer] unspecified
-//                                             ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<Object>> Function() x29;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<FutureOr<Object>>> Function() x30;
 //^
 // [analyzer] unspecified
-//                                                ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<A<Object>>> Function() x31;
 //^
 // [analyzer] unspecified
-//                                         ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicBound<A<A<FutureOr<Object>>>> Function() x32;
 //^
 // [analyzer] unspecified
-//                                                   ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   FinvCyclicCoBound<Object> Function() x33;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvCyclicCoBound<FutureOr<Object>> Function() x34;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvCyclicCoBound<Function(Function(Object))> Function() x35;
 //^
 // [analyzer] unspecified
-//                                                         ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   FinvCyclicCoBound<Function(Function(FutureOr<Object>))> Function() x36;
 //^
 // [analyzer] unspecified
-//                                                                   ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(void Function(FinvBound<Object>)) x37;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function(void Function(FinvBound<FutureOr<Object>>)) x38;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function(void Function(FinvCyclicBound<Object>)) x39;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(void Function(FinvCyclicBound<FutureOr<Object>>)) x40;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(void Function(FinvCyclicBound<A<Object>>)) x41;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                            ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(void Function(FinvCyclicBound<A<FutureOr<Object>>>)) x42;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(void Function(FinvCyclicBound<A<A<Object>>>)) x43;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                            ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(void Function(FinvCyclicBound<A<A<FutureOr<Object>>>>)) x44;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(void Function(FinvCyclicCoBound<Object>)) x45;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(void Function(FinvCyclicCoBound<FutureOr<Object>>)) x46;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(void Function(FinvCyclicCoBound<Function(Function(Object))>))
 //^
 // [analyzer] unspecified
-      x47;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
+      x47;
   void Function(
       void Function(
           FinvCyclicCoBound<Function(Function(FutureOr<Object>))>)) x48;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvBound<Object>) x49;
 //^
 // [analyzer] unspecified
-//                                 ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function(FinvBound<FutureOr<Object>>) x50;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function(FinvCyclicBound<Object>) x51;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<FutureOr<Object>>) x52;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<Object>>) x53;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<FutureOr<Object>>>) x54;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<A<Object>>>) x55;
 //^
 // [analyzer] unspecified
-//                                             ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<A<FutureOr<Object>>>>) x56;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicCoBound<Object>) x57;
 //^
 // [analyzer] unspecified
-//                                         ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvCyclicCoBound<FutureOr<Object>>) x58;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvCyclicCoBound<Function(Function(Object))>) x59;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvCyclicCoBound<Function(Function(FutureOr<Object>))>) x60;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvBound<Object>) Function() x61;
 //^
 // [analyzer] unspecified
-//                                            ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function(FinvBound<FutureOr<Object>>) Function() x62;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function(FinvCyclicBound<Object>) Function() x63;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<FutureOr<Object>>) Function() x64;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<Object>>) Function() x65;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<FutureOr<Object>>>) Function() x66;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<A<Object>>>) Function() x67;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicBound<A<A<FutureOr<Object>>>>) Function() x68;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function(FinvCyclicCoBound<Object>) Function() x69;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvCyclicCoBound<FutureOr<Object>>) Function() x70;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvCyclicCoBound<Function(Function(Object))>) Function() x71;
 //^
 // [analyzer] unspecified
-//                                                                        ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function(FinvCyclicCoBound<Function(Function(FutureOr<Object>))>)
 //^
 // [analyzer] unspecified
-      Function() x72;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
+      Function() x72;
   void Function<Y extends FinvBound<Object>>() x73;
 //^
 // [analyzer] unspecified
-//                                             ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function<Y extends FinvBound<FutureOr<Object>>>() x74;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function<Y extends FinvCyclicBound<Object>>() x75;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends FinvCyclicBound<FutureOr<Object>>>() x76;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends FinvCyclicBound<A<Object>>>() x77;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                        ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends FinvCyclicBound<A<FutureOr<Object>>>>() x78;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends FinvCyclicBound<A<A<Object>>>>() x79;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                        ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends FinvCyclicBound<A<A<FutureOr<Object>>>>>() x80;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends FinvCyclicCoBound<Object>>() x81;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function<Y extends FinvCyclicCoBound<FutureOr<Object>>>() x82;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function<Y extends FinvCyclicCoBound<Function(Function(Object))>>() x83;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function<
       Y extends FinvCyclicCoBound<Function(Function(FutureOr<Object>))>>() x84;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function<Y extends A<FinvBound<Object>>>() x85;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function<Y extends A<FinvBound<FutureOr<Object>>>>() x86;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   void Function<Y extends A<FinvCyclicBound<Object>>>() x87;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends A<FinvCyclicBound<FutureOr<Object>>>>() x88;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends A<FinvCyclicBound<A<Object>>>>() x89;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                          ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends A<FinvCyclicBound<A<FutureOr<Object>>>>>() x90;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends A<FinvCyclicBound<A<A<Object>>>>>() x91;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                          ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends A<FinvCyclicBound<A<A<FutureOr<Object>>>>>>() x92;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   void Function<Y extends A<FinvCyclicCoBound<Object>>>() x93;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function<Y extends A<FinvCyclicCoBound<FutureOr<Object>>>>() x94;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   void Function<Y extends A<FinvCyclicCoBound<Function(Function(Object))>>>()
 //^
 // [analyzer] unspecified
-      x95;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
+      x95;
   void Function<
       Y extends A<
           FinvCyclicCoBound<Function(Function(FutureOr<Object>))>>>() x96;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Finv<FinvBound<Object>> x97;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   Finv<FinvBound<FutureOr<Object>>> x98;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   Finv<FinvCyclicBound<Object>> x99;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Finv<FinvCyclicBound<FutureOr<Object>>> x100;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Finv<FinvCyclicBound<A<Object>>> x101;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Finv<FinvCyclicBound<A<FutureOr<Object>>>> x102;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Finv<FinvCyclicBound<A<A<Object>>>> x103;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Finv<FinvCyclicBound<A<A<FutureOr<Object>>>>> x104;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Finv<FinvCyclicCoBound<Object>> x105;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Finv<FinvCyclicCoBound<FutureOr<Object>>> x106;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Finv<FinvCyclicCoBound<Function(Function(Object))>> x107;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Finv<FinvCyclicCoBound<Function(Function(FutureOr<Object>))>> x108;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Funu<FinvBound<Object>> x109;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   Funu<FinvBound<FutureOr<Object>>> x110;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FinvBound'.
   Funu<FinvCyclicBound<Object>> x111;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Funu<FinvCyclicBound<FutureOr<Object>>> x112;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Funu<FinvCyclicBound<A<Object>>> x113;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Funu<FinvCyclicBound<A<FutureOr<Object>>>> x114;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Funu<FinvCyclicBound<A<A<Object>>>> x115;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Funu<FinvCyclicBound<A<A<FutureOr<Object>>>>> x116;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FinvCyclicBound'.
   Funu<FinvCyclicCoBound<Object>> x117;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Funu<FinvCyclicCoBound<FutureOr<Object>>> x118;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Funu<FinvCyclicCoBound<Function(Function(Object))>> x119;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
   Funu<FinvCyclicCoBound<Function(Function(FutureOr<Object>))>> x120;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
 }
 
@@ -2498,612 +2402,588 @@
   FunuBound<Object> x1;
 //^
 // [analyzer] unspecified
-//                  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   FunuBound<FutureOr<Object>> x2;
 //^
 // [analyzer] unspecified
-//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   FunuCyclicBound<Object> x3;
 //^
 // [analyzer] unspecified
-//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<FutureOr<Object>> x4;
 //^
 // [analyzer] unspecified
-//                                  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<Object>> x5;
 //^
 // [analyzer] unspecified
-//                           ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<FutureOr<Object>>> x6;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<A<Object>>> x7;
 //^
 // [analyzer] unspecified
-//                              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<A<FutureOr<Object>>>> x8;
 //^
 // [analyzer] unspecified
-//                                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicCoBound<Object> x9;
 //^
 // [analyzer] unspecified
-//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<FutureOr<Object>> x10;
 //^
 // [analyzer] unspecified
-//                                    ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<Function(Function(Object))> x13;
 //^
 // [analyzer] unspecified
-//                                              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<Function(Function(FutureOr<Object>))> x14;
 //^
 // [analyzer] unspecified
-//                                                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
 
   // --- Same non-super-bounded types in a context.
   A<FunuBound<Object>> x19;
 //^
 // [analyzer] unspecified
-//                     ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   A<FunuBound<FutureOr<Object>>> x20;
 //^
 // [analyzer] unspecified
-//                               ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   A<FunuCyclicBound<Object>> x21;
 //^
 // [analyzer] unspecified
-//                           ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   A<FunuCyclicBound<FutureOr<Object>>> x22;
 //^
 // [analyzer] unspecified
-//                                     ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   A<FunuCyclicBound<A<Object>>> x23;
 //^
 // [analyzer] unspecified
-//                              ^
+//  ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   A<FunuCyclicBound<A<FutureOr<Object>>>> x24;
 //^
 // [analyzer] unspecified
-//                                        ^
+//  ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   A<FunuCyclicBound<A<A<Object>>>> x25;
 //^
 // [analyzer] unspecified
-//                                 ^
+//  ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   A<FunuCyclicBound<A<A<FutureOr<Object>>>>> x26;
 //^
 // [analyzer] unspecified
-//                                           ^
+//  ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   A<FunuCyclicCoBound<Object>> x27;
 //^
 // [analyzer] unspecified
-//                             ^
+//  ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   A<FunuCyclicCoBound<FutureOr<Object>>> x28;
 //^
 // [analyzer] unspecified
-//                                       ^
+//  ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   A<FunuCyclicCoBound<Function(Function(Object))>> x31;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   A<FunuCyclicCoBound<Function(Function(FutureOr<Object>))>> x32;
 //^
 // [analyzer] unspecified
-//                                                           ^
+//  ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuBound<Object> Function() x37;
 //^
 // [analyzer] unspecified
-//                             ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   FunuBound<FutureOr<Object>> Function() x38;
 //^
 // [analyzer] unspecified
-//                                       ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   FunuCyclicBound<Object> Function() x39;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<FutureOr<Object>> Function() x40;
 //^
 // [analyzer] unspecified
-//                                             ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<Object>> Function() x41;
 //^
 // [analyzer] unspecified
-//                                      ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<FutureOr<Object>>> Function() x42;
 //^
 // [analyzer] unspecified
-//                                                ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<A<Object>>> Function() x43;
 //^
 // [analyzer] unspecified
-//                                         ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicBound<A<A<FutureOr<Object>>>> Function() x44;
 //^
 // [analyzer] unspecified
-//                                                   ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   FunuCyclicCoBound<Object> Function() x45;
 //^
 // [analyzer] unspecified
-//                                     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<FutureOr<Object>> Function() x46;
 //^
 // [analyzer] unspecified
-//                                               ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<Function(Function(Object))> Function() x49;
 //^
 // [analyzer] unspecified
-//                                                         ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<Function(Function(FutureOr<Object>))> Function() x50;
 //^
 // [analyzer] unspecified
-//                                                                   ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(void Function(FunuBound<Object>)) x55;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function(void Function(FunuBound<FutureOr<Object>>)) x56;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function(void Function(FunuCyclicBound<Object>)) x57;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(void Function(FunuCyclicBound<FutureOr<Object>>)) x58;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(void Function(FunuCyclicBound<A<Object>>)) x59;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                            ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(void Function(FunuCyclicBound<A<FutureOr<Object>>>)) x60;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                            ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(void Function(FunuCyclicBound<A<A<Object>>>)) x61;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                            ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(void Function(FunuCyclicBound<A<A<FutureOr<Object>>>>)) x62;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                            ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(void Function(FunuCyclicCoBound<Object>)) x63;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                            ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(void Function(FunuCyclicCoBound<FutureOr<Object>>)) x64;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                            ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(void Function(FunuCyclicCoBound<Function(Function(Object))>))
 //^
 // [analyzer] unspecified
-      x67;
-//    ^
+//                            ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
+      x67;
   void Function(
       void Function(
           FunuCyclicCoBound<Function(Function(FutureOr<Object>))>)) x68;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuBound<Object>) x73;
 //^
 // [analyzer] unspecified
-//                                 ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function(FunuBound<FutureOr<Object>>) x74;
 //^
 // [analyzer] unspecified
-//                                           ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function(FunuCyclicBound<Object>) x75;
 //^
 // [analyzer] unspecified
-//                                       ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<FutureOr<Object>>) x76;
 //^
 // [analyzer] unspecified
-//                                                 ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<Object>>) x77;
 //^
 // [analyzer] unspecified
-//                                          ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<FutureOr<Object>>>) x78;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<A<Object>>>) x79;
 //^
 // [analyzer] unspecified
-//                                             ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<A<FutureOr<Object>>>>) x80;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicCoBound<Object>) x81;
 //^
 // [analyzer] unspecified
-//                                         ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuCyclicCoBound<FutureOr<Object>>) x82;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuCyclicCoBound<Function(Function(Object))>) x85;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuCyclicCoBound<Function(Function(FutureOr<Object>))>) x86;
 //^
 // [analyzer] unspecified
-//                                                                       ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuBound<Object>) Function() x91;
 //^
 // [analyzer] unspecified
-//                                            ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function(FunuBound<FutureOr<Object>>) Function() x92;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function(FunuCyclicBound<Object>) Function() x93;
 //^
 // [analyzer] unspecified
-//                                                  ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<FutureOr<Object>>) Function() x94;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<Object>>) Function() x95;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//              ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<FutureOr<Object>>>) Function() x96;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//              ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<A<Object>>>) Function() x97;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//              ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicBound<A<A<FutureOr<Object>>>>) Function() x98;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//              ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function(FunuCyclicCoBound<Object>) Function() x99;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//              ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuCyclicCoBound<FutureOr<Object>>) Function() x100;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//              ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuCyclicCoBound<Function(Function(Object))>) Function() x103;
 //^
 // [analyzer] unspecified
-//                                                                        ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function(FunuCyclicCoBound<Function(Function(FutureOr<Object>))>)
 //^
 // [analyzer] unspecified
-      Function() x104;
-//               ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
+      Function() x104;
   void Function<Y extends FunuBound<Object>>() x109;
 //^
 // [analyzer] unspecified
-//                                             ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function<Y extends FunuBound<FutureOr<Object>>>() x110;
 //^
 // [analyzer] unspecified
-//                                                       ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function<Y extends FunuCyclicBound<Object>>() x111;
 //^
 // [analyzer] unspecified
-//                                                   ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends FunuCyclicBound<FutureOr<Object>>>() x112;
 //^
 // [analyzer] unspecified
-//                                                             ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends FunuCyclicBound<A<Object>>>() x113;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                        ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends FunuCyclicBound<A<FutureOr<Object>>>>() x114;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                        ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends FunuCyclicBound<A<A<Object>>>>() x115;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                        ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends FunuCyclicBound<A<A<FutureOr<Object>>>>>() x116;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                        ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends FunuCyclicCoBound<Object>>() x117;
 //^
 // [analyzer] unspecified
-//                                                     ^
+//                        ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function<Y extends FunuCyclicCoBound<FutureOr<Object>>>() x118;
 //^
 // [analyzer] unspecified
-//                                                               ^
+//                        ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function<Y extends FunuCyclicCoBound<Function(Function(Object))>>() x121;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//                        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function<
       Y extends FunuCyclicCoBound<Function(Function(FutureOr<Object>))>>() x122;
 //^
 // [analyzer] unspecified
-//                                                                         ^
+//              ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function<Y extends A<FunuBound<Object>>>() x127;
 //^
 // [analyzer] unspecified
-//                                                ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function<Y extends A<FunuBound<FutureOr<Object>>>>() x128;
 //^
 // [analyzer] unspecified
-//                                                          ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   void Function<Y extends A<FunuCyclicBound<Object>>>() x129;
 //^
 // [analyzer] unspecified
-//                                                      ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends A<FunuCyclicBound<FutureOr<Object>>>>() x130;
 //^
 // [analyzer] unspecified
-//                                                                ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends A<FunuCyclicBound<A<Object>>>>() x131;
 //^
 // [analyzer] unspecified
-//                                                         ^
+//                          ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends A<FunuCyclicBound<A<FutureOr<Object>>>>>() x132;
 //^
 // [analyzer] unspecified
-//                                                                   ^
+//                          ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends A<FunuCyclicBound<A<A<Object>>>>>() x133;
 //^
 // [analyzer] unspecified
-//                                                            ^
+//                          ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends A<FunuCyclicBound<A<A<FutureOr<Object>>>>>>() x134;
 //^
 // [analyzer] unspecified
-//                                                                      ^
+//                          ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   void Function<Y extends A<FunuCyclicCoBound<Object>>>() x135;
 //^
 // [analyzer] unspecified
-//                                                        ^
+//                          ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function<Y extends A<FunuCyclicCoBound<FutureOr<Object>>>>() x136;
 //^
 // [analyzer] unspecified
-//                                                                  ^
+//                          ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   void Function<Y extends A<FunuCyclicCoBound<Function(Function(Object))>>>()
 //^
 // [analyzer] unspecified
-      x139;
-//    ^
+//                          ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
+      x139;
   void Function<
       Y extends A<
           FunuCyclicCoBound<Function(Function(FutureOr<Object>))>>>() x140;
 //^
 // [analyzer] unspecified
-//                                                                    ^
+//        ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Finv<FunuBound<Object>> x145;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   Finv<FunuBound<FutureOr<Object>>> x146;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   Finv<FunuCyclicBound<Object>> x147;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Finv<FunuCyclicBound<FutureOr<Object>>> x148;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Finv<FunuCyclicBound<A<Object>>> x149;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Finv<FunuCyclicBound<A<FutureOr<Object>>>> x150;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Finv<FunuCyclicBound<A<A<Object>>>> x151;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Finv<FunuCyclicBound<A<A<FutureOr<Object>>>>> x152;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Finv<FunuCyclicCoBound<Object>> x153;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Finv<FunuCyclicCoBound<FutureOr<Object>>> x154;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Finv<FunuCyclicCoBound<Function(Function(Object))>> x157;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Finv<FunuCyclicCoBound<Function(Function(FutureOr<Object>))>> x158;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Funu<FunuBound<Object>> x163;
 //^
 // [analyzer] unspecified
-//                        ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   Funu<FunuBound<FutureOr<Object>>> x164;
 //^
 // [analyzer] unspecified
-//                                  ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'num' of the type variable 'X' on 'FunuBound'.
   Funu<FunuCyclicBound<Object>> x165;
 //^
 // [analyzer] unspecified
-//                              ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Funu<FunuCyclicBound<FutureOr<Object>>> x166;
 //^
 // [analyzer] unspecified
-//                                        ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Funu<FunuCyclicBound<A<Object>>> x167;
 //^
 // [analyzer] unspecified
-//                                 ^
+//     ^
 // [cfe] Type argument 'A<Object>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Funu<FunuCyclicBound<A<FutureOr<Object>>>> x168;
 //^
 // [analyzer] unspecified
-//                                           ^
+//     ^
 // [cfe] Type argument 'A<FutureOr<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Funu<FunuCyclicBound<A<A<Object>>>> x169;
 //^
 // [analyzer] unspecified
-//                                    ^
+//     ^
 // [cfe] Type argument 'A<A<Object>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Funu<FunuCyclicBound<A<A<FutureOr<Object>>>>> x170;
 //^
 // [analyzer] unspecified
-//                                              ^
+//     ^
 // [cfe] Type argument 'A<A<FutureOr<Object>>>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'FunuCyclicBound'.
   Funu<FunuCyclicCoBound<Object>> x171;
 //^
 // [analyzer] unspecified
-//                                ^
+//     ^
 // [cfe] Type argument 'Object' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Funu<FunuCyclicCoBound<FutureOr<Object>>> x172;
 //^
 // [analyzer] unspecified
-//                                          ^
+//     ^
 // [cfe] Type argument 'FutureOr<Object>' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Funu<FunuCyclicCoBound<Function(Function(Object))>> x175;
 //^
 // [analyzer] unspecified
-//                                                    ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(Object))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   Funu<FunuCyclicCoBound<Function(Function(FutureOr<Object>))>> x176;
 //^
 // [analyzer] unspecified
-//                                                              ^
+//     ^
 // [cfe] Type argument 'dynamic Function(dynamic Function(FutureOr<Object>))' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
 }
 
@@ -3111,12 +2991,10 @@
   FunuCyclicCoBound<Function(Never)> x1;
 //^
 // [analyzer] unspecified
-//                                   ^
 // [cfe] Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
   FunuCyclicCoBound<Function(N)> x2;
 //^
 // [analyzer] unspecified
-//                               ^
 // [cfe] Type argument 'dynamic Function(N)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FunuCyclicCoBound'.
 }
 
@@ -3133,8 +3011,6 @@
   void f(AinvCyclicCoBound source) {
 //       ^
 // [analyzer] unspecified
-//                         ^
-// [cfe] Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
 // [cfe] Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
 
     // We do not use `source` in further tests, because the type of `source`
@@ -3146,9 +3022,8 @@
   void f(B<AinvCyclicCoBound> source) {
 //       ^
 // [analyzer] unspecified
-//                            ^
-// [cfe] Type argument 'AinvCyclicCoBound<dynamic Function(Never) Function(dynamic Function(Never)), dynamic Function(Never)>' doesn't conform to the bound 'B<X>' of the type variable 'X' on 'B'.
-// [cfe] Type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(X)' of the type variable 'X' on 'FinvCyclicCoBound'.
+// [cfe] Type argument 'AinvCyclicCoBound<FinvCyclicCoBound<dynamic Function(Never)>, dynamic Function(Never)>' doesn't conform to the bound 'B<X>' of the type variable 'X' on 'B'.
+//         ^
 // [cfe] Inferred type argument 'dynamic Function(Never)' doesn't conform to the bound 'dynamic Function(Y)' of the type variable 'Y' on 'AinvCyclicCoBound'.
 
     // We do not use `source` in further tests, because the type of `source`
diff --git a/tests/language/generic_methods/generic_function_result_test.dart b/tests/language/generic_methods/generic_function_result_test.dart
index 569c2f9..910c9b4 100644
--- a/tests/language/generic_methods/generic_function_result_test.dart
+++ b/tests/language/generic_methods/generic_function_result_test.dart
@@ -14,17 +14,15 @@
           (int i, int j) => i + j;
 
 List<int Function<T>(S, int)> bar<S extends int>() {
+// [error column 1]
+// [cfe] A generic function type can't be used as a type argument.
 //   ^^^^^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT
-//                                              ^
-// [cfe] A generic function type can't be used as a type argument.
   return <int Function<T>(S, int)>[foo, foo];
 }
 
 void main() {
   var list = bar<int>();
-  //  ^
-  // [cfe] Generic function type 'int Function<T>(int, int)' inferred as a type argument.
   print(list[0].runtimeType);
   Expect.equals(123, list[1](100, 23));
 }
diff --git a/tests/language/malbounded/instantiation_test.dart b/tests/language/malbounded/instantiation_test.dart
index 2f397b2..d181b51 100644
--- a/tests/language/malbounded/instantiation_test.dart
+++ b/tests/language/malbounded/instantiation_test.dart
@@ -4,13 +4,13 @@
 
 class Super<T extends num> {}
 class Malbounded1 implements Super<String> {}
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded1'.
+//                           ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
 //                                 ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 class Malbounded2 extends Super<String> {}
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded2'.
+//                        ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
 //                              ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tests/language/malbounded/type_cast_test.dart b/tests/language/malbounded/type_cast_test.dart
index 2c56e68..e72cb3d 100644
--- a/tests/language/malbounded/type_cast_test.dart
+++ b/tests/language/malbounded/type_cast_test.dart
@@ -6,15 +6,15 @@
 
 class Super<T extends num> {}
 class Malbounded1 implements Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded1'.
+//                           ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
   <String>
 // ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   {}
 class Malbounded2 extends Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded2'.
+//                        ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
   <String>
 // ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
@@ -27,7 +27,7 @@
   Expect.throwsTypeError(() => s as Malbounded1);
   Expect.throwsTypeError(() => s as Malbounded2);
   s as Super
-  //^
+  //   ^
   // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
       <String>
 //     ^^^^^^
diff --git a/tests/language/malbounded/type_literal_test.dart b/tests/language/malbounded/type_literal_test.dart
index 2369b69..a356615 100644
--- a/tests/language/malbounded/type_literal_test.dart
+++ b/tests/language/malbounded/type_literal_test.dart
@@ -7,8 +7,8 @@
 class Super<T extends num> {}
 
 class Malbounded extends Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded'.
+//                       ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
     <String>
 //   ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
diff --git a/tests/language/malbounded/type_test2_test.dart b/tests/language/malbounded/type_test2_test.dart
index 8eec3aa..3ee3e90 100644
--- a/tests/language/malbounded/type_test2_test.dart
+++ b/tests/language/malbounded/type_test2_test.dart
@@ -9,7 +9,7 @@
 class B<T> {
   test() {
     new A() is A
-    //      ^
+    //         ^
     // [cfe] Type argument 'T' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
         <T>
 //       ^
diff --git a/tests/language/malbounded/type_test_test.dart b/tests/language/malbounded/type_test_test.dart
index 70fc939..c0c61ff 100644
--- a/tests/language/malbounded/type_test_test.dart
+++ b/tests/language/malbounded/type_test_test.dart
@@ -7,16 +7,16 @@
 class Super<T extends num> {}
 
 class Malbounded1 implements Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded1'.
+//                           ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
     <String>
 //   ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
     {}
 
 class Malbounded2 extends Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded2'.
+//                        ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
     <String>
 //   ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
@@ -29,7 +29,7 @@
   Expect.isFalse(s is Malbounded1);
   Expect.isFalse(s is Malbounded2);
   Expect.isTrue(s is Super
-  //              ^
+  //                 ^
   // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
       <String>
 //     ^^^^^^
diff --git a/tests/language/regress/regress18628_2_test.dart b/tests/language/regress/regress18628_2_test.dart
index 622b724..11a1a44 100644
--- a/tests/language/regress/regress18628_2_test.dart
+++ b/tests/language/regress/regress18628_2_test.dart
@@ -13,8 +13,8 @@
 // This line is supposed to cause the warning; the other lines are
 // marked because they don't make sense when [Y] is not defined.
 class Y<U> extends X<U> {}
-//    ^
-// [cfe] Type argument 'U' doesn't conform to the bound 'Type' of the type variable 'T' on 'X' in the supertype 'X' of class 'Y'.
+//                 ^
+// [cfe] Type argument 'U' doesn't conform to the bound 'Type' of the type variable 'T' on 'X'.
 //                   ^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tests/language/type_variable/bounds3_test.dart b/tests/language/type_variable/bounds3_test.dart
index 471112b..c0482d6 100644
--- a/tests/language/type_variable/bounds3_test.dart
+++ b/tests/language/type_variable/bounds3_test.dart
@@ -9,7 +9,7 @@
 class B<X, Y> {
   foo(x) {
     return x is A<X>;
-    //       ^
+    //          ^
     // [cfe] Type argument 'X' doesn't conform to the bound 'int' of the type variable 'K' on 'A'.
     //            ^
     // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
diff --git a/tests/language/type_variable/bounds4_test.dart b/tests/language/type_variable/bounds4_test.dart
index 9908b9c..e4d5223 100644
--- a/tests/language/type_variable/bounds4_test.dart
+++ b/tests/language/type_variable/bounds4_test.dart
@@ -10,8 +10,8 @@
     > {}
 
 class B<T> implements A<T> {}
-//    ^
-// [cfe] Type argument 'T' doesn't conform to the bound 'num' of the type variable 'T' on 'A' in the supertype 'A' of class 'B'.
+//                    ^
+// [cfe] Type argument 'T' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //                      ^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tests/language/variance/variance_in_subtyping_error_test.dart b/tests/language/variance/variance_in_subtyping_error_test.dart
index 4271fd0..1230d2b 100644
--- a/tests/language/variance/variance_in_subtyping_error_test.dart
+++ b/tests/language/variance/variance_in_subtyping_error_test.dart
@@ -41,10 +41,10 @@
 
 class D {
   C<Contravariant<Lower>> method1() {
+//^
+// [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
   //^^^^^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                             ^
-  // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C' in the return type.
     return C<Contravariant<Lower>>();
     //     ^
     // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
@@ -57,10 +57,10 @@
 
 main() {
   C<Contravariant<Lower>> c = new C<Contravariant<Lower>>();
+//^
+// [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
   //^^^^^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                      ^
-  // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
   //                              ^
   // [cfe] Type argument 'Contravariant<Lower>' doesn't conform to the bound 'Contravariant<Middle>' of the type variable 'T' on 'C'.
   //                                ^^^^^^^^^^^^^^^^^^^^
diff --git a/tests/language/variance/variance_inout_subtyping_error_test.dart b/tests/language/variance/variance_inout_subtyping_error_test.dart
index d994e6c..51e9052 100644
--- a/tests/language/variance/variance_inout_subtyping_error_test.dart
+++ b/tests/language/variance/variance_inout_subtyping_error_test.dart
@@ -58,10 +58,10 @@
 
 class E {
   D<Invariant<Upper>> method1() {
+//^
+// [cfe] Type argument 'Invariant<Upper>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                         ^
-  // [cfe] Type argument 'Invariant<Upper>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D' in the return type.
     return D<Invariant<Upper>>();
     //     ^
     // [cfe] Type argument 'Invariant<Upper>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
@@ -70,10 +70,10 @@
   }
 
   D<Invariant<Lower>> method2() {
+//^
+// [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                         ^
-  // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D' in the return type.
     return D<Invariant<Lower>>();
     //     ^
     // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
@@ -86,19 +86,19 @@
 
 main() {
   D<Invariant<Upper>> dUpper = new D<Invariant<Upper>>();
+//^
+// [cfe] Type argument 'Invariant<Upper>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                  ^
-  // [cfe] Type argument 'Invariant<Upper>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //                               ^
   // [cfe] Type argument 'Invariant<Upper>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //                                 ^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   D<Invariant<Lower>> dLower = new D<Invariant<Lower>>();
+//^
+// [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                  ^
-  // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //                               ^
   // [cfe] Type argument 'Invariant<Lower>' doesn't conform to the bound 'Invariant<Middle>' of the type variable 'T' on 'D'.
   //                                 ^^^^^^^^^^^^^^^^
diff --git a/tests/language/variance/variance_out_subtyping_error_test.dart b/tests/language/variance/variance_out_subtyping_error_test.dart
index 2ddcd3e..ecce279 100644
--- a/tests/language/variance/variance_out_subtyping_error_test.dart
+++ b/tests/language/variance/variance_out_subtyping_error_test.dart
@@ -41,10 +41,10 @@
 
 class D {
   C<Covariant<Upper>> method1() {
+//^
+// [cfe] Type argument 'Covariant<Upper>' doesn't conform to the bound 'Covariant<Middle>' of the type variable 'T' on 'C'.
   //^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                         ^
-  // [cfe] Type argument 'Covariant<Upper>' doesn't conform to the bound 'Covariant<Middle>' of the type variable 'T' on 'C' in the return type.
     return C<Covariant<Upper>>();
     //     ^
     // [cfe] Type argument 'Covariant<Upper>' doesn't conform to the bound 'Covariant<Middle>' of the type variable 'T' on 'C'.
@@ -57,10 +57,10 @@
 
 main() {
   C<Covariant<Upper>> c = new C<Covariant<Upper>>();
+//^
+// [cfe] Type argument 'Covariant<Upper>' doesn't conform to the bound 'Covariant<Middle>' of the type variable 'T' on 'C'.
   //^^^^^^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                  ^
-  // [cfe] Type argument 'Covariant<Upper>' doesn't conform to the bound 'Covariant<Middle>' of the type variable 'T' on 'C'.
   //                          ^
   // [cfe] Type argument 'Covariant<Upper>' doesn't conform to the bound 'Covariant<Middle>' of the type variable 'T' on 'C'.
   //                            ^^^^^^^^^^^^^^^^
diff --git a/tests/language_2/generic/f_bounded_quantification_test.dart b/tests/language_2/generic/f_bounded_quantification_test.dart
index 055e05a..7ff3b40 100644
--- a/tests/language_2/generic/f_bounded_quantification_test.dart
+++ b/tests/language_2/generic/f_bounded_quantification_test.dart
@@ -19,10 +19,10 @@
 main() {
   FBound<Bar> fb = new FBound<Bar>();
   FBound<SubBar> fsb = new FBound<SubBar>();
+//^
+// [cfe] Type argument 'SubBar' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //     ^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //             ^
-  // [cfe] Type argument 'SubBar' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                       ^
   // [cfe] Type argument 'SubBar' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                              ^^^^^^
@@ -30,10 +30,10 @@
 
   FBound<Baz<Bar>> fbb = new FBound<Baz<Bar>>();
   FBound<SubBaz<Bar>> fsbb = new FBound<SubBaz<Bar>>();
+//^
+// [cfe] Type argument 'SubBaz<Bar>' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //     ^^^^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-  //                  ^
-  // [cfe] Type argument 'SubBaz<Bar>' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                             ^
   // [cfe] Type argument 'SubBaz<Bar>' doesn't conform to the bound 'FBound<F>' of the type variable 'F' on 'FBound'.
   //                                    ^^^^^^^^^^^
diff --git a/tests/language_2/generic/function_type_as_type_argument_test.dart b/tests/language_2/generic/function_type_as_type_argument_test.dart
index 130d1b2..6dcc8f7 100644
--- a/tests/language_2/generic/function_type_as_type_argument_test.dart
+++ b/tests/language_2/generic/function_type_as_type_argument_test.dart
@@ -18,17 +18,16 @@
 
   // Generic function types are not allowed as type arguments.
   List<T Function<T>(T)> typedList = <T Function<T>(T)>[foo];
-  //   ^^^^^^^^^^^^^^^^
-  // [analyzer] COMPILE_TIME_ERROR.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT
-  //                     ^
-  // [cfe] A generic function type can't be used as a type argument.
+//^
+// [cfe] A generic function type can't be used as a type argument.
+//     ^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT
 
   // Type inference must also give an error.
   var inferredList = [foo];
-  //  ^
-  // [cfe] Generic function type 'T Function<T>(T)' inferred as a type argument.
   //                 ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
+  // [cfe] Generic function type 'T Function<T>(T)' inferred as a type argument.
 
   // No error if illegal type cannot be inferred.
   var dynamicList = <dynamic>[foo];
diff --git a/tests/language_2/generic_methods/generic_function_result_test.dart b/tests/language_2/generic_methods/generic_function_result_test.dart
index d291d2d..d50dcb5 100644
--- a/tests/language_2/generic_methods/generic_function_result_test.dart
+++ b/tests/language_2/generic_methods/generic_function_result_test.dart
@@ -16,17 +16,15 @@
           (int i, int j) => i + j;
 
 List<int Function<T>(S, int)> bar<S extends int>() {
+// [error column 1]
+// [cfe] A generic function type can't be used as a type argument.
 //   ^^^^^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT
-//                                              ^
-// [cfe] A generic function type can't be used as a type argument.
   return <int Function<T>(S, int)>[foo, foo];
 }
 
 void main() {
   var list = bar<int>();
-  //  ^
-  // [cfe] Generic function type 'int Function<T>(int, int)' inferred as a type argument.
   print(list[0].runtimeType);
   Expect.equals(123, list[1](100, 23));
 }
diff --git a/tests/language_2/malbounded/instantiation_test.dart b/tests/language_2/malbounded/instantiation_test.dart
index 9f52427..b3f0bfa 100644
--- a/tests/language_2/malbounded/instantiation_test.dart
+++ b/tests/language_2/malbounded/instantiation_test.dart
@@ -6,13 +6,13 @@
 
 class Super<T extends num> {}
 class Malbounded1 implements Super<String> {}
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded1'.
+//                           ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
 //                                 ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 class Malbounded2 extends Super<String> {}
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded2'.
+//                        ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
 //                              ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tests/language_2/malbounded/type_cast_test.dart b/tests/language_2/malbounded/type_cast_test.dart
index 476c63e..7e98c55 100644
--- a/tests/language_2/malbounded/type_cast_test.dart
+++ b/tests/language_2/malbounded/type_cast_test.dart
@@ -8,15 +8,15 @@
 
 class Super<T extends num> {}
 class Malbounded1 implements Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded1'.
+//                           ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
   <String>
 // ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   {}
 class Malbounded2 extends Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded2'.
+//                        ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
   <String>
 // ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
@@ -29,7 +29,7 @@
   Expect.throwsTypeError(() => s as Malbounded1);
   Expect.throwsTypeError(() => s as Malbounded2);
   s as Super
-  //^
+  //   ^
   // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
       <String>
 //     ^^^^^^
diff --git a/tests/language_2/malbounded/type_literal_test.dart b/tests/language_2/malbounded/type_literal_test.dart
index ebfef5b..eb4a34c 100644
--- a/tests/language_2/malbounded/type_literal_test.dart
+++ b/tests/language_2/malbounded/type_literal_test.dart
@@ -9,8 +9,8 @@
 class Super<T extends num> {}
 
 class Malbounded extends Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded'.
+//                       ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
     <String>
 //   ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
diff --git a/tests/language_2/malbounded/type_test2_test.dart b/tests/language_2/malbounded/type_test2_test.dart
index 542b7f6..0e4cb69 100644
--- a/tests/language_2/malbounded/type_test2_test.dart
+++ b/tests/language_2/malbounded/type_test2_test.dart
@@ -11,7 +11,7 @@
 class B<T> {
   test() {
     new A() is A
-    //      ^
+    //         ^
     // [cfe] Type argument 'T' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
         <T>
 //       ^
diff --git a/tests/language_2/malbounded/type_test_test.dart b/tests/language_2/malbounded/type_test_test.dart
index b5434fd..c312857 100644
--- a/tests/language_2/malbounded/type_test_test.dart
+++ b/tests/language_2/malbounded/type_test_test.dart
@@ -9,16 +9,16 @@
 class Super<T extends num> {}
 
 class Malbounded1 implements Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded1'.
+//                           ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
     <String>
 //   ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
     {}
 
 class Malbounded2 extends Super
-//    ^
-// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super' in the supertype 'Super' of class 'Malbounded2'.
+//                        ^
+// [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
     <String>
 //   ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
@@ -31,7 +31,7 @@
   Expect.isFalse(s is Malbounded1);
   Expect.isFalse(s is Malbounded2);
   Expect.isTrue(s is Super
-  //              ^
+  //                 ^
   // [cfe] Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'Super'.
       <String>
 //     ^^^^^^
diff --git a/tests/language_2/regress/regress18628_2_test.dart b/tests/language_2/regress/regress18628_2_test.dart
index 85d59ca..e035c81 100644
--- a/tests/language_2/regress/regress18628_2_test.dart
+++ b/tests/language_2/regress/regress18628_2_test.dart
@@ -15,8 +15,8 @@
 // This line is supposed to cause the warning; the other lines are
 // marked because they don't make sense when [Y] is not defined.
 class Y<U> extends X<U> {}
-//    ^
-// [cfe] Type argument 'U' doesn't conform to the bound 'Type' of the type variable 'T' on 'X' in the supertype 'X' of class 'Y'.
+//                 ^
+// [cfe] Type argument 'U' doesn't conform to the bound 'Type' of the type variable 'T' on 'X'.
 //                   ^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tests/language_2/type_variable/bounds3_test.dart b/tests/language_2/type_variable/bounds3_test.dart
index a56675e..7246ac7 100644
--- a/tests/language_2/type_variable/bounds3_test.dart
+++ b/tests/language_2/type_variable/bounds3_test.dart
@@ -11,7 +11,7 @@
 class B<X, Y> {
   foo(x) {
     return x is A<X>;
-    //       ^
+    //          ^
     // [cfe] Type argument 'X' doesn't conform to the bound 'int' of the type variable 'K' on 'A'.
     //            ^
     // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
diff --git a/tests/language_2/type_variable/bounds4_test.dart b/tests/language_2/type_variable/bounds4_test.dart
index 265c94f0..9fa6558 100644
--- a/tests/language_2/type_variable/bounds4_test.dart
+++ b/tests/language_2/type_variable/bounds4_test.dart
@@ -12,8 +12,8 @@
     > {}
 
 class B<T> implements A<T> {}
-//    ^
-// [cfe] Type argument 'T' doesn't conform to the bound 'num' of the type variable 'T' on 'A' in the supertype 'A' of class 'B'.
+//                    ^
+// [cfe] Type argument 'T' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
 //                      ^
 // [analyzer] COMPILE_TIME_ERROR.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
 
diff --git a/tools/VERSION b/tools/VERSION
index 0ba49e7..0b55526 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 125
+PRERELEASE 126
 PRERELEASE_PATCH 0
\ No newline at end of file